ClassCastException с spring-data-jpa - PullRequest
       82

ClassCastException с spring-data-jpa

0 голосов
/ 14 октября 2019

Я работаю с Spring Web Services и Spring JPA Data.

У меня есть три проекта:

  • doc-ws. Веб-приложение, которое является конечной точкой моих документальных веб-сервисов.
  • sign-ws. Веб-приложение, которое является конечной точкой моих веб-служб для подписи.
  • data-ws. Модуль Jar со всеми сущностями jpa (@Entity), репозиториями Spring jpa (@Repository) и классами сервисов Spring (@Services).

Doc-ws и sign-ws зависят от data-Таким образом, data-ws.jar включен в doc-ws.war и sign-ws.war.

Когда я развертываю только веб-приложение doc-ws, все тесты веб-служб работают нормально. Когда я развертываю только веб-приложение sign-ws, все тесты веб-служб работают нормально. Но когда я развертываю оба веб-приложения вместе в одном и том же Jboss EAP 7.1, я получаю исключения ClassCastException при выполнении тестов веб-служб.

java.lang.ClassCastException: com.ieci.mugeju.data.entity. IdocConfiguration не может быть приведена к com.ieci.mugeju.data.entity.IdocConfiguration

    List<IdocConfiguration> properties = idocConfigurationRepository.findAll();   <-- works fine

    for (IdocConfiguration property: properties)    <-- Here throws the ClassCastException
    {
       .... // CODE
    }

Сообщение об исключении ссылается на ту же сущность jpa (com.ieci.mugeju.data.entity.IdocConfiguration), поэтому я не 'Я не понимаю, почему это исключение выбрасывается.

Это должно быть проблема загрузки классов между обоими веб-приложениями, но я не уверен.

Я работаю с JBoss EAP 7.1, spring-data-jpa 2.0.5, eclipseling 2.6.4, spring-ws-core 3.0.1.

Есть идеи, почему я получаю это исключение? Как я мог решить?

Спасибо

1 Ответ

0 голосов
/ 14 октября 2019

Я обнаружил, в чем проблема. Когда я определил «entityManagerFactory», я не устанавливал свойство с именем «persistenceUnitName». Затем, когда был создан контекст постоянства, он был создан с именем «default» в обоих веб-проектах.

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="jpaDialect" ref="jpaDialect"/>      
    <property name="packagesToScan" value="com.ieci.mugeju.data.entity" />              
    ...
</bean>

Я не знаю почему, но «методы поиска репозитория» второго проекта возвращают классы сущностей jpaопределено в первом загрузчике проекта проекта. Очень странное поведение, я ожидал, что каждое веб-приложение будет использовать свой собственный загрузчик классов и изолировать их друг от друга.

Если я установлю persistenceUnitName для каждого проекта, то все будет нормально, и каждое веб-приложение будет использовать свой собственный загрузчик классов.

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter" ref="jpaAdapter" />
    <property name="jpaDialect" ref="jpaDialect"/>      
    <property name="packagesToScan" value="com.ieci.mugeju.data.entity" />      
    <property name="persistenceUnitName" value="${spring.application.name}" />
    ...
</bean>
...