在我基于struts2、spring IoC和Transasctions、jpa、Hibernate的应用程序中,我想介绍一个“审计日志函数”,它将记录所有重要事件,例如:用户已经创建/更新,或者有人打开了票证……
我想把这个日志保存在数据库中,因此我将有一个DAO。我还为此目的创建了一个服务类'AuditLogService‘,它将具有事务行为“propagation=”REQUIRES_NEW,因为无论记录的事件是否成功,我都希望记录事件。
问题是,如果我在我的用户服务中有这样的东西:
@Override
public boolean saveUser(UserDto userDto) {
User u = new User();
u.setFirstName(userDto.getFirstName());
u.setLastName(userDto.getLastName());
u.setUserName(userDto.getUserName());
u.setPassword(userDto.getPassword());
u.setIsLdapUser(userDto.getIsLdapUser());
u.setId(userDto.getId());
u.setAgentId(userDto.getAgentId());
Boolean eventStatus = true;
String event="";
try{
if (u.getId()!=null){
dao.update(u);
event = "UPDATE_USER";
}else{
dao.create(u);
event = "CREATE_USER";
}
}catch (Exception e) {
e.printStackTrace();
eventStatus = false;
return false;
}
finally {
AuditLogEvent ale = auditLogEventDao.getAuditLogEvent(event);
auditLogService.addAuditLogEvent(ale, eventStatus,u.toString());
}
return false;
}审计日志方法在提交save方法之前执行,并报告事件为true,但实际上事件为false。
知道我怎么解决这个问题吗?或者这种方法不是最好的..。?
现在我的方法签名就像这里一样。一切正常,我可以检测一个操作是否失败或成功,我可以将它记录到一个日志文件中,但是如果我想通过一个dao类将它记录到数据库中的一个表中,当操作失败并且事务回滚时,我的审计条目就不会被插入。
首先,我认为这是因为这两个操作、需要审计的实际方法和审计事件都在同一个事务上下文中运行,如果其中一个被回滚,那么整个事务就是,我已经为方面日志部分创建了一个新的事务。但这似乎行不通。
有伊迪卡吗为什么?
发布于 2012-07-25 08:27:21
这种方法是不正确的,因为声明性事务是通过一个audit通知(AOP)实现的,所以整个方法都会执行,包括带有审计的最终块,然后返回并提交事务。
我建议编写您自己的审计方面,因为审计或日志记录是横切关注点的主要示例。
看看面向方面的Spring编程
我会使用(最后)建议之后,这样你就可以审计失败和成功的东西了。
实际上它并不是那么复杂的…您不需要AspectJ,Spring方面就足够满足给定的目的了。
https://stackoverflow.com/questions/11645435
复制相似问题