2010-11-14 3 views
0

У меня есть следующий класс (который является объектом слушателя JPA):Autowired подал еще нуль

@Service 
public class AuditLogListener { 

    @Autowired 
    IDomainObjectDAO domainObjectDAO; 

    @PostLoad 
    public void saveOldData(DomainObject obj) { 
     domainObjectDAO.findAll(); 
     System.out.println("after Load"); 
    } 

    @PreUpdate 
    public void logChanges(DomainObject obj) { 

    } 

} 

Поданные domainObjectDAO признанное весной и в соответствии с лога, автоматически подключен.

отрывок из журнала:

[http-8080-1] DEBUG org.springframework.beans.factory.annotation.InjectionMetadata - Found injected element on class [com.legolas.entityListeners.AuditLogListener]: AutowiredFieldElement for com.legolas.dao.interfaces.IDomainObjectDAO com.legolas.entityListeners.AuditLogListener.domainObjectDAO 
[http-8080-1] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'auditLogListener' to allow for resolving potential circular references 
[http-8080-1] DEBUG org.springframework.beans.factory.annotation.InjectionMetadata - Processing injected method of bean 'auditLogListener': AutowiredFieldElement for com.legolas.dao.interfaces.IDomainObjectDAO com.legolas.entityListeners.AuditLogListener.domainObjectDAO 
[http-8080-1] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'domainObjectDAO' 
[http-8080-1] DEBUG org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - Autowiring by type from bean name 'auditLogListener' to bean named 'domainObjectDAO' 

Но при проверке поля в режиме отладки я вижу, что поля является пустым и исключение при вызове метода findAll().

Почему подано null и есть ли способ решить эту проблему?

спасибо.

+0

смотри также http://stackoverflow.com/questions/4143881/spring-entitymanagerfactory-hibernate-listeners-injection – Bozho

ответ

4

Слушатели JPA создаются провайдером JPA, а не весной, поэтому их зависимости не вводятся весной. Таким образом, теперь у вас есть два экземпляра вашего класса: один, используемый JPA (без вложенных зависимостей), а другой - экземпляр Spring (вы видите его в журнале).

Итак, вам нужно вставлять зависимости в объект, который не управляется Spring. У вас есть два варианта:

  • Используй @Configurable

  • использовать какое-то статическое или поточно-связанное состояние, чтобы получить ссылку на ApplicationContext от вашего слушателя. Например, в типичном Spring веб-приложения, которое вы можете получить его следующим образом:

    RequestContextUtils.getWebApplicationContext(
        (SerlvetRequest) RequestContextHolder.currentRequestAttributes() 
         .resolveReference(RequestAttributes.REFERENCE_REQUEST)) 
    
+0

I использовал @Configurable Annotation и в журнале, который я вижу теперь в журнале, который компонент вводится в менеджер сущности JPA, то есть Bean, созданный провайдером JPA, распознает это поле (я прав?), но все же поле равно null , –

+0

@Noam: Вы сконфигурировали время загрузки, как требуется для '@ Configurable'? – axtavt

+0

Не знаю, что это такое, я проверю его и вернусь к вам. –

Смежные вопросы