ClassCastException with spring-data-jpa



我正在使用Spring Web Services和Spring JPA Data。

我有三个项目:

  • 文档-ws。Web 应用程序,它是我的文档 Web 服务的端点。
  • 签到。Web 应用程序,它是我的标志 Web 服务的终结点。
  • 数据-ws.包含所有 jpa 实体 (@Entity(、spring jpa 存储库 (@Repository( 和 spring 服务类 (@Services( 的 jar 模块。

Doc-ws 和 sign-ws 依赖于 data-ws,因此 data-ws.jar 包含在 doc-ws.war 和 sign-ws.war 中。

当我单独部署 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>

我不知道为什么,但是第二个项目的"查找存储库方法"返回第一个项目类加载器中定义的jpa实体类。非常奇怪的行为,我希望每个Web应用程序都使用自己的类加载器,并且彼此隔离。

如果我为每个项目设置了一个持久性单位名称,那么一切正常,每个 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>

相关内容

  • 没有找到相关文章

最新更新