Spring数据JPA-具体实体类的依赖项注入
我们正在从MyBatis迁移到Spring数据JPA(使用hibernate)。最初,Spring配置将特定域级对象的util:map指定为枚举键引用的值。因此,映射被注入到服务级别类中。然后,该映射用于在流程流期间基于特定枚举获取域级对象。现在我们已经重构了服务层,以使用支持Spring数据的@Entity域级对象,当我们尝试使用enum键获取实体的实例时,它将返回一个代理(正如您所期望的)。因此,当我们尝试使用返回的实例时,我们会得到一个ClassCastException(由:java.lang.ClassCastException:com.sun.proxy引起。$Proxy43不能强制转换为com.ourpackage.Event)。我的问题是:如何将@Entity类注入到util:map配置中,以便设置更多属性 以下是实体对象映射和枚举查找键的配置:Spring数据JPA-具体实体类的依赖项注入,spring,jpa,spring-data-jpa,classcastexception,Spring,Jpa,Spring Data Jpa,Classcastexception,我们正在从MyBatis迁移到Spring数据JPA(使用hibernate)。最初,Spring配置将特定域级对象的util:map指定为枚举键引用的值。因此,映射被注入到服务级别类中。然后,该映射用于在流程流期间基于特定枚举获取域级对象。现在我们已经重构了服务层,以使用支持Spring数据的@Entity域级对象,当我们尝试使用enum键获取实体的实例时,它将返回一个代理(正如您所期望的)。因此,当我们尝试使用返回的实例时,我们会得到一个ClassCastException(由:java.l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<!--*********************************************************************-->
<!-- Event bean definitions -->
<!--*********************************************************************-->
<bean id="workEvent" class="com.ourpackage.Event">
<constructor-arg name="action" type="java.lang.String" value="action"/>
<constructor-arg name="type" type="java.lang.String" value="type"/>
<constructor-arg name="description" type="java.lang.String" value="A description"/>
</bean>
<!--*********************************************************************-->
<!-- Event Maps -->
<!--*********************************************************************-->
<util:map id="workEvents" map-class="java.util.HashMap" key-type="com.anotherpackage.EventType" value-type="com.ourpackage.Event">
<entry>
<key><value type="com.anotherpackage.EventType">WORK_ITEM</value></key>
<ref local="workEvent"/>
</entry>
</util:map>
</beans>
以下是使用此映射的服务类的代码:
// The following line produces the ClassCastException
workEvent = workEvents.get(EventType.WORK_ITEM);
当然,这可以通过取消依赖注入配置并简单地动态构造事件类来解决,但是配置是首选方法
任何帮助都将不胜感激 问题是,具体类不再是
com.ourpackage.Event
,因为Spring在其中封装了com.sun.proxy.$Proxy43
类型的代理,并且不可能对事件强制转换代理,因为它们是两种完全不同的类型
为了解决这个问题,让事件实现一个接口并转换到该接口,而不是转换到一个具体的类
一般来说,在大量使用代理/AOP(如Spring/Hibernate应用程序)的应用程序中,避免强制转换为具体类型是一种很好的做法。您从哪个类中获得了哪些ClassCastException?。我假设com.ourpackage.Event是workEvent的类型?Ho Koitoer,我在上面的示例中更改了包的名称,而不是使用真实的信息。我们有一个命令类,它使用注入的workEvents HashMap:workEvent=workEvents.get(EventType.WORK\u项);正是在这个关头,我们得到了ClassCastException。异常本身如下所示:由以下原因引起:java.lang.ClassCastException:com.sun.proxy。$Proxy43无法强制转换为com.ourpackage.Event,因此问题在于Spring在将workEvent作为代理返回时将其注入映射中的方式。您是否尝试强制转换为接口以避免类强制转换异常?
// The following line produces the ClassCastException
workEvent = workEvents.get(EventType.WORK_ITEM);