带有 spring-data-jpa 的 ClassCastException
ClassCastException with spring-data-jpa
我正在使用 Spring Web 服务和 Spring JPA 数据。
我有三个项目:
- 文档-ws。 Web 应用程序,它是我的文档 Web 服务的端点。
- 签名-ws。 Web 应用程序,它是我登录 Web 服务的端点。
- 数据-ws。包含所有 jpa 实体 (@Entity)、spring jpa 存储库 (@Repository) 和 spring 服务 类 (@Services) 的 Jar 模块。
doc-ws和sign-ws对data-ws有依赖,所以在doc-ws.war和sign-ws.war中包含了一个data-ws.jar.
当我单独部署 doc-ws Web 应用程序时,所有 Web 服务测试都运行良好。
当我单独部署 sign-ws Web 应用程序时,所有 Web 服务测试都运行良好。
但是,当我在同一个 Jboss EAP 7.1 中同时部署两个 Web 应用程序时,我在执行 Web 服务测试时遇到 ClassCastExceptions。
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),所以我不明白为什么会抛出此异常。
这一定是两个 Web 应用程序之间的类加载问题,但我不确定。
我正在使用 JBoss EAP 7.1,spring-data-jpa 2.0.5,eclipseling 2.6.4,spring-ws-core 3.0.1。
知道为什么我会收到此异常吗?我该如何解决?
谢谢
我发现了问题所在。当我定义 'entityManagerFactory' 时,我没有设置名为 'persistenceUnitName' 的 属性。然后在创建持久性上下文时,在两个 Web 项目中都使用名称 '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>
我不知道为什么 'find repository methods' 第二个项目 return jpa 实体 类 在第一个项目类加载器中定义。非常奇怪的行为,我希望每个 Web 应用程序都使用自己的类加载器,并且彼此隔离。
如果我为每个项目设置一个 persistenceUnitName,那么一切正常,每个 Web 应用程序都使用自己的类加载器。
<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>
我正在使用 Spring Web 服务和 Spring JPA 数据。
我有三个项目:
- 文档-ws。 Web 应用程序,它是我的文档 Web 服务的端点。
- 签名-ws。 Web 应用程序,它是我登录 Web 服务的端点。
- 数据-ws。包含所有 jpa 实体 (@Entity)、spring jpa 存储库 (@Repository) 和 spring 服务 类 (@Services) 的 Jar 模块。
doc-ws和sign-ws对data-ws有依赖,所以在doc-ws.war和sign-ws.war中包含了一个data-ws.jar.
当我单独部署 doc-ws Web 应用程序时,所有 Web 服务测试都运行良好。 当我单独部署 sign-ws Web 应用程序时,所有 Web 服务测试都运行良好。 但是,当我在同一个 Jboss EAP 7.1 中同时部署两个 Web 应用程序时,我在执行 Web 服务测试时遇到 ClassCastExceptions。
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),所以我不明白为什么会抛出此异常。
这一定是两个 Web 应用程序之间的类加载问题,但我不确定。
我正在使用 JBoss EAP 7.1,spring-data-jpa 2.0.5,eclipseling 2.6.4,spring-ws-core 3.0.1。
知道为什么我会收到此异常吗?我该如何解决?
谢谢
我发现了问题所在。当我定义 'entityManagerFactory' 时,我没有设置名为 'persistenceUnitName' 的 属性。然后在创建持久性上下文时,在两个 Web 项目中都使用名称 '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>
我不知道为什么 'find repository methods' 第二个项目 return jpa 实体 类 在第一个项目类加载器中定义。非常奇怪的行为,我希望每个 Web 应用程序都使用自己的类加载器,并且彼此隔离。
如果我为每个项目设置一个 persistenceUnitName,那么一切正常,每个 Web 应用程序都使用自己的类加载器。
<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>