2014-01-14 84 views
2

我扩展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; 

回答

3

Spring将永远留下@Autowired目标为null(除非null是您注射了什么)。这应该告诉你,如果@Autowired字段是null,那么Spring与它无关。

看起来就是这样。通过提供类似的东西

<entry key="hibernate.ejb.interceptor" value="com.net.filter.AuditInterceptor"/> 

我相信你告诉Hibernate自己创建该实例,因此它不会是一个Spring托管bean。

如果您发布了其余的bean定义,因为我不知道要尝试注入哪个bean,可能会有其他选择。

+0

我正在尝试向我发布的类注入服务。该服务(IUserSessionService)为空。此服务autowire已在不同的bean中工作。 – lior

+0

@lior我想知道您在上面发布的属性属于哪个bean。这个bean不是使用你的AuditInterceptor bean,而是实例化它自己的,它不会被spring管理,因此不会处理任何注入目标。 –

+0

感谢您的帮助,但我在下面找到了解决方案:http://stackoverflow.com/questions/19217872/injecting-jpas-entity-manager-in-hibernates-emptyinterceptor – lior

3

我知道这可能是两年来太晚了 - 但我正在寻找同样问题的答案,并认为这对未来某个人会有帮助。

看看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管理,并自动连接将工作!