gpt4 book ai didi

java - Autowiring 字段仍然为空

转载 作者:行者123 更新时间:2023-11-29 08:16:48 25 4
gpt4 key购买 nike

我有以下类(这是一个 JPA 实体监听器):

@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 被 Spring 识别并根据日志自动连接。

日志摘录:

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

但是在 Debug模式下检查字段时,我发现字段为空,并且在调用 findAll() 方法时抛出异常。

为什么提交的是空的,有没有办法解决这个问题?

谢谢。

最佳答案

JPA 监听器由 JPA 提供程序而不是 Spring 实例化,因此它们的依赖项不由 Spring 注入(inject)。也就是说,现在您有类的两个实例 - 一个由 JPA 使用(没有注入(inject)依赖项),另一个由 Spring 实例化(您在日志中看到)。

因此,您需要将依赖项注入(inject)到不受 Spring 管理的对象中。您有两个选择:

  • 使用 @Configurable

  • 使用某种静态或线程绑定(bind)状态从您的监听器获取对 ApplicationContext 的引用。例如,在典型的 Spring Web 应用程序中,您可以通过以下方式获取它:

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

关于java - Autowiring 字段仍然为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4178527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com