我有一个itemWriter,它将项目写入表中。在编写时,我得到一个ConstraintViolationException,并且我正在使用SkipPolicy跳过该异常,并且已经实现了@OnWriteError方法,因此捕获和跳过异常并在侦听器内部调用@OnWriteError方法效果很好。在@OnWriteError方法内部,我正在调用另一个方法,以在捕获到异常时将事件标记为失败。
@OnWriteError
public void onWriteError(Exception,Exception,List Items) {
log.info(“ WRITE ERROR LISTENER CALLED”);
学生= items.get(items.size()-1);
studnetManager.updateStatuss(学生,“ FAILED);
}
公共无效updateStatuss(学生,状态) {
Student.setStatus(status);
StudentRepository.save(Student);
}
updateStatuss()被成功调用,但是学生记录未标记为FAILED。 谁能帮助我理解这一点?
答案 0 :(得分:1)
如Javadoc中所述,ItemWriteListener#onWriteError将在要回滚的事务中被调用。
因此,您需要在单独的事务中调用该代码(用updateStatus
注释@Transactional(propagation = "REQUIRES_NEW")
或使用TransactionTemplate
以编程方式调用事务代码)。