工作中使用SpringAOP记录操作数据前后的变化
@Aspect
@Component
public class SystemOperateLogAop {
private static final Logger log = LoggerFactory.getLogger(SystemOperateLogAop.class);
@Resource
private SystemOperateLogService sysOptLogService;
@Resource
private SequenceService sequenceService;
/**
* 定义切点:只切入注解{@link SysLog}的业务方法
*/
@Pointcut("@annotation(org.ibond.bpm.system.annotation.SysLog)")
public void logPointCut() {
}
@SuppressWarnings("unchecked")
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
// 保存日志
Long logId = saveSysLog(point);
// 执行方法
Object result = point.proceed();
if (result instanceof Map) {
Map<String, Object> res = (Map<String, Object>) result;
Object success = res.get(ResultMessageUtils.CODE);
SystemOperateLog operateLog = new SystemOperateLog();
operateLog.setId(logId);
if (success instanceof Boolean)
operateLog.setResult(Boolean.parseBoolean(success.toString()) ? 1L : 0L);
else
operateLog.setResult(Long.parseLong(success.toString()));
Object objId = res.get(ResultMessageUtils.DATA);
if (null != objId && objId instanceof Long && StringUtils.isNotEmpty(objId.toString()))
operateLog.setObjectid(Long.parseLong(objId.toString()));
systemOperateLogService.updateLog(operateLog);
}
return result;
}
private Long saveSysLog(ProceedingJoinPoint joinPoint) throws Exception {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLog sysLog = method.getAnnotation(SysLog.class);
LogDesc logDesc = sysLog.desc();
// RequiresPermissions permission =
// method.getAnnotation(RequiresPermissions.class);
// String permCode = "";
// if (null != permission)
// permCode = StringUtils.join(permission.value(), ",");
// 操作对象
Object obj = joinPoint.getArgs()[0];
String desc = logDesc.getDesc();
String operName = "";
if (desc.contains(".")) {
String[] split = desc.split("\\.");
operName = split[split.length - 1];
}
SystemOperateLog operateLog = getOperateLog(obj, operName);
sysOptLogService.createLog(logDesc, operateLog);
sysOptLogService.insertSelective(operateLog);
return operateLog.getId();
}
/**
* 设置日志内容、对象id、对象代码
*/
private SystemOperateLog getOperateLog(Object obj, String operType) throws Exception {
Class<?> clazz = obj.getClass();
Table table = clazz.getAnnotation(Table.class);
if (null == table || StringUtils.isEmpty(table.name()))
throw new Exception("未知的对象表名");
Long idValue = (Long) Reflections.invokeGetter(obj, "id");
SystemOperateLog operateLog = new SystemOperateLog();
operateLog.setObjectid(idValue);
operateLog.setObjectcode(table.name());
StringBuilder cont = new StringBuilder();
cont.append("【" + operType + "】");
Field[] fields = clazz.getDeclaredFields();
if (OperateType.noCompare(operType)) {
if (OperateType.isDelete(operType)) {
Map<String, Object> entityMap = sysOptLogService.selectEntityById(table.name(),
idValue);
log.info(entityMap != null ? entityMap.toString() : "entityMap数据为空");
obj = Reflections.mapToObj(entityMap, clazz);
}
for (Field field : fields) {
Property prop = field.getAnnotation(Property.class);
if (null == prop)
continue;
Object value = Reflections.invokeGetter(obj, field.getName());
if (null == value || StringUtils.isEmpty(value.toString()))
continue;
ConvertValue convertValue = field.getAnnotation(ConvertValue.class);
if (null != convertValue) {
IConvertService convertService = SpringUtils.getBean(IConvertService.class,
convertValue.service());
value = convertService.convert(value);
}
cont.append(prop.desc()).append(":").append(dealValue(value)).append(",");
}
if (cont.lastIndexOf(",") != -1)
cont.deleteCharAt(cont.lastIndexOf(","));
operateLog.setContent(cont.toString());
return operateLog;
}
Map<String, Object> entityMap = sysOptLogService.selectEntityById(table.name(), idValue);
Object oldObj = Reflections.mapToObj(entityMap, clazz);
for (Field field : fields) {
Property prop = field.getAnnotation(Property.class);
if (null == prop)
continue;
String fieldName = field.getName();
Object value = dealValue(Reflections.invokeGetter(obj, fieldName));
if (prop.compareChange()) {
// 使用getter获取属性值,getter方法中实现值的转换
Object oldValue = dealValue(Reflections.invokeGetter(oldObj, fieldName));
ConvertValue convertValue = field.getAnnotation(ConvertValue.class);
if (null != convertValue) {
String propName = convertValue.convertProp();
IConvertService convertService = SpringUtils.getBean(IConvertService.class,
convertValue.service());
if (null != oldValue && StringUtils.isNotEmpty(oldValue.toString())) {
oldValue = convertService.convert(oldValue);
}
Reflections.invokeSetter(oldObj, propName, oldValue);
value = dealValue(Reflections.invokeGetter(obj, propName));
}
if (null == oldValue && null != value || null != oldValue && null == value
|| null != oldValue && null != value && !oldValue.equals(value)) {
cont.append(prop.desc()).append(":").append(oldValue).append("->").append(value)
.append(",");
}
}
}
if (cont.lastIndexOf(",") != -1)
cont.deleteCharAt(cont.lastIndexOf(","));
operateLog.setContent(cont.toString());
return operateLog;
}
private Object dealValue(Object obj) {
if (null == obj || StringUtils.isEmpty((obj.toString()).trim()))
return "";
if (obj instanceof Number) { // 数值类型,去掉小数点后多余的0,如果最后一位是.则去掉
String str = obj.toString();
if (str.indexOf(".") > 0) {
str = str.replaceAll("0+?$", "").replaceAll("[.]$", "");
}
return str;
}
return obj;
}
}