Spring数据JPA-具体实体类的依赖项注入

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

我们正在从MyBatis迁移到Spring数据JPA(使用hibernate)。最初,Spring配置将特定域级对象的util:map指定为枚举键引用的值。因此,映射被注入到服务级别类中。然后,该映射用于在流程流期间基于特定枚举获取域级对象。现在我们已经重构了服务层,以使用支持Spring数据的@Entity域级对象,当我们尝试使用enum键获取实体的实例时,它将返回一个代理(正如您所期望的)。因此,当我们尝试使用返回的实例时,我们会得到一个ClassCastException(由:java.lang.ClassCastException:com.sun.proxy引起。$Proxy43不能强制转换为com.ourpackage.Event)。我的问题是:如何将@Entity类注入到util:map配置中,以便设置更多属性

以下是实体对象映射和枚举查找键的配置:

<?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);