首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring日志服务和事务

spring日志服务和事务
EN

Stack Overflow用户
提问于 2012-07-25 08:16:42
回答 1查看 1.6K关注 0票数 1

在我基于struts2、spring IoC和Transasctions、jpa、Hibernate的应用程序中,我想介绍一个“审计日志函数”,它将记录所有重要事件,例如:用户已经创建/更新,或者有人打开了票证……

我想把这个日志保存在数据库中,因此我将有一个DAO。我还为此目的创建了一个服务类'AuditLogService‘,它将具有事务行为“propagation=”REQUIRES_NEW,因为无论记录的事件是否成功,我都希望记录事件。

问题是,如果我在我的用户服务中有这样的东西:

代码语言:javascript
复制
@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。

知道我怎么解决这个问题吗?或者这种方法不是最好的..。?

  • 最新消息! 在迈克尔的建议之后,我也把我的服务变成了一个方面 @方面@Service类AuditLogAspectImpl实现了AuditLogAspect { @Autowired私有AuditLogDao dao;@Autowired私有UserDao userDao;@Service@AfterRe哪个(切入点= "execution(* xxx.yy.services..*.save*(..))",返回= "retVal")公共布尔afterLogEvent(JoinPoint joinPoint,对象retVal){ } }

现在我的方法签名就像这里一样。一切正常,我可以检测一个操作是否失败或成功,我可以将它记录到一个日志文件中,但是如果我想通过一个dao类将它记录到数据库中的一个表中,当操作失败并且事务回滚时,我的审计条目就不会被插入。

首先,我认为这是因为这两个操作、需要审计的实际方法和审计事件都在同一个事务上下文中运行,如果其中一个被回滚,那么整个事务就是,我已经为方面日志部分创建了一个新的事务。但这似乎行不通。

有伊迪卡吗为什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-25 08:27:21

这种方法是不正确的,因为声明性事务是通过一个audit通知(AOP)实现的,所以整个方法都会执行,包括带有审计的最终块,然后返回并提交事务。

我建议编写您自己的审计方面,因为审计或日志记录是横切关注点的主要示例。

看看面向方面的Spring编程

我会使用(最后)建议之后,这样你就可以审计失败和成功的东西了。

实际上它并不是那么复杂的…您不需要AspectJ,Spring方面就足够满足给定的目的了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档