2014-01-14 2 views
2

나는 hibernate.EmptyInterceptor를 확장하고 있으며 구현시 일부 서비스에 autowired하고 싶지만 null을 리턴한다. 나는 클래스 위에 @Component 어노테이션을 추가했다. 내 코드 :Autowired to Interceptor

<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> 

및 클래스 : (null 당신이 주입하는 것입니다하지 않는 한)

@SuppressWarnings("serial") 
@Component 
public class AuditInterceptor extends EmptyInterceptor { 

    @Autowired 
    private IUserSessionService userSessionService; 

답변

3

null으로 @Autowired 대상을 떠나지 않을 것입니다. 그럴 경우 @Autowired 필드가 null 일 경우 Spring과 아무 관계가 없다고 말해야합니다.

여기에있는 것처럼 보입니다.

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

같은 것을 제공함으로써 나는 당신이 Hibernate에게 그 인스턴스 자체를 생성한다고 말하고 있기 때문에 Spring 관리 빈이 아닐 것이라고 믿는다.

어떤 콩을 주입하려고하는지 모르기 때문에 나머지 빈 정의를 게시하면 다른 방법이있을 수 있습니다.

+0

게시 된 클래스에 서비스를 주입하려고합니다. 서비스 (IUserSessionService)가 null입니다. 이 서비스 autowire는 이미 다른 콩에서 작동합니다. – lior

+0

@lior 위 게시 한 속성이 속한 bean을 알고 싶습니다. 이 Bean은 AuditInterceptor 빈을 사용하는 대신 자신의 인스턴스를 생성하는데, 이는 스프링에 의해 관리되지 않으므로 해당 사출 타겟을 처리하지 않습니다. –

+0

도움을 주셔서 감사합니다.하지만 해결책을 찾았습니다. http://stackoverflow.com/questions/19217872/injecting-jpas-entity-manager-in-hibernates-emptyinterceptor – lior

3

아마도 2 년이 지나서야 알 수 있습니다.하지만 같은 문제에 대한 답을 찾고 있었고 앞으로 누군가에게 유용 할 것이라고 생각했습니다.

Hibernate 코드는 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> 

이제 콩 MyInterceptor의 봄은 관리되고 autowiring을 작동합니다!