【问题标题】:How to inject service into listener?如何将服务注入监听器?
【发布时间】:2021-09-28 10:36:28
【问题描述】:

我的目标是通过 AuditTrailListener 监听用户实体 并在插入/更新/删除操作时将审计数据保存到数据库中 在用户上执行。发生某些操作后,我可以收听并打印消息。问题是当我想将 AuditService 的实例注入 AuditTrailListener 并将 AuditObject 数据存储到数据库时。我得到 NullPointerException。关于如何解决问题的选项很少(例如静态字段),但它们都不起作用?

用户.java

@Entity
@EntityListeners(AuditTrailListener.class)
public class User {
    private static Log log = LogFactory.getLog(User.class);

    @Id
    @GeneratedValue
    private int id;
    
    private String userName;
}

AuditObject.java

@Getter
@Setter
@Entity(name="AuditObject")
public class AuditObject {
    @Id
    @GeneratedValue
    private int id=1L;  // test
    
    @Column(length=20)
    private String op="test1"; // test
}

AuditRepository.java

@Repository
public interface AuditRepository extends JpaRepository<AuditObject, Long> {
    List<AuditObject> findAll();
}

AuditService.java

@Service
@RequiredArgsConstructor    // lombok
@Transactional
public class AuditService {
    private final AuditRepository repo;

    public Audit saveOrUpdate(Audit audit) {
        return repo.save(audit);
    }
}

AuditTrailListener.java

public class AuditTrailListener {

    static private AuditService auditService;

    @Autowired
    public void init(AuditService auditService)
    {
        AuditTrailListener.auditService = auditService;
    }

    @PrePersist
    @PreUpdate
    @PreRemove
    private void beforeAnyUpdate(User user) {
        System.out.println(user);
        auditService.saveOrUpdate(new AuditObject());//java.lang.NullPointerException
    }
    
    @PostPersist
    @PostUpdate
    @PostRemove
    private void afterAnyUpdate(User user) {
        System.out.println(user);
        auditService.saveOrUpdate(new AuditObject());//java.lang.NullPointerException
    }
    
    @PostLoad
    private void afterLoad(User user) {
        System.out.println(user);
        auditService.saveOrUpdate(new AuditObject());//java.lang.NullPointerException
    }
}

【问题讨论】:

  • 您是否尝试用@Component 简单地注释AuditTrailListener
  • 是的,但仍然是 NullPointerException。
  • 您使用哪个 Spring Boot 版本?这在最近的版本中应该可以正常工作
  • Spring Boot v2.4.2

标签: java spring spring-boot lombok


【解决方案1】:

您需要将 AuditTrailListener 设为 Spring 管理的 Bean。一种简单的方法是使用@Component 对其进行注释,如下所示:

@Component
public class AuditTrailListener {
   (...)
}

【讨论】:

  • 有注解@Component和没有注解完全一样的问题。
  • AuditTrailListener 位于哪个包中?您能否将您的主要课程@SpringBootApplication 添加到您的问题中?谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多