我已经阅读了一些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);
}
}
}
}
}
}