【发布时间】: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