我正在扩展hibernate.EmptyInterceptor,在我的实现中,我希望自动连接到某些服务,但它们返回null。我在类上添加了一个@Component注释。我的代码:
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.transactionType" value="JTA" />
<entry key="hibernate.current_session_context_class" value="jta" />
<entry key="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<entry key="hibernate.connection.autocommit" value="false" />
<entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>
</map>
</property>
和班级:
@SuppressWarnings("serial")
@Component
public class AuditInterceptor extends EmptyInterceptor {
@Autowired
private IUserSessionService userSessionService;
答案 0 :(得分:4)
我知道这可能要晚了两年 - 但我正在寻找同样问题的答案,并认为这对未来的某些人有用。
看看Hibernate代码看起来如果给出类名,Hibernate将实例化拦截器的新实例,但是如果传入bean实例引用,它将使用它。
所以
<bean id="myInterceptor" class="com.net.filter.AuditInterceptor" />
...
<property name="jpaPropertyMap">
<map>
<entry key="javax.persistence.transactionType" value="JTA" />
<entry key="hibernate.current_session_context_class" value="jta" />
<entry key="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<entry key="hibernate.connection.autocommit" value="false" />
<entry key="hibernate.ejb.interceptor" >
<ref bean="myInterceptor" />
</entry>
</map>
</property>
现在bean myInterceptor是Spring管理的,自动装配将起作用!
答案 1 :(得分:3)
Spring将从不将@Autowired
目标保留为null
(除非null
是您正在注入的内容)。那应该告诉你,如果@Autowired
字段是null
,那么Spring与它无关。
这似乎就是这种情况。通过提供类似
的东西<entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/>
我相信你告诉Hibernate自己创建该实例,因此它不会是一个Spring托管bean。
如果你发布剩下的bean定义,因为我不知道你想要注入什么bean,可能有其他选择。