Spring / AOP:在数据库中实现活动日志的最佳方法

我已经阅读了一些Spring / AOP教程,并且对相关概念有所了解.

现在满足我的要求,我需要创建一个活动日志实现,该实现将在数据库中保存已登录用户的活动,范围可以从申请服务或在使用Admin用户的情况下创建新用户等.对于具有注释的任何方法(例如@ActivityLog),此信息将以actorId,actionComment,actionTime,actedUponId等形式保存.

现在,如果我创建一个POJO类(映射到数据库中的ActivityLog表)并想从Advice内部保存此数据(最好使用与该方法相同的事务,该方法使用@Transactional批注),那么我实际上如何填充此POJO中的变量?我可能可以从会话对象&中获取actorId. actionTime可以仅仅是new Date(),但是actionComment / actedUponId的动态值如何?

任何帮助将是辉煌的! (顺便说一句,我有一个要求不要使用休眠拦截器.)

解决方法:

这是一个完整的示例:

@Aspect
@Component
public class WebMethodAuditor {

protected final Log logger = LogFactory.getLog(getClass());

public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";

@Autowired
AuditRecordDAO auditRecordDAO; 

@Before("execution(* com.mycontrollers.*.*(..))")
public void beforeWebMethodExecution(JoinPoint joinPoint) {
    Object[] args = joinPoint.getArgs();
    String methodName = joinPoint.getSignature().getName();
    User principal = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    Timestamp timestamp = new Timestamp(new java.util.Date().getTime());
    // only log those methods called by an end user
    if(principal.getUsername() != null) {
        for(Object o : args) {
            Boolean doInspect = true;
            if(o instanceof ServletRequestDataBinder) doInspect = false;
            if(o instanceof ExtendedModelMap) doInspect = false;
            if(doInspect) {
                if(o instanceof BaseForm ) {
                    // only show form objects
                    AuditRecord ar = new AuditRecord();
                    ar.setUsername(principal.getUsername());
                    ar.setClazz(o.getClass().getCanonicalName());
                    ar.setMethod(methodName);
                    ar.setAsString(o.toString());
                    ar.setAudit_timestamp(timestamp);
                    auditRecordDAO.save(ar);
                }
            }
        }
    }
}

}
上一篇:Java -- Spring学习笔记8、AspectJ的AOP配置管理事务


下一篇:基于Aspectj表达式配置的Spring AOP