2014-01-14 89 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管理,並自動連接將工作!