字段修改日志工具类
package com.jwx.license.common.util;
import com.jwx.license.common.annotation.ModifyLog;
import com.jwx.license.pojo.dto.KeyEditDTO;
import com.jwx.license.pojo.entity.KeyDO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 字段修改日志工具类
*
* @author ZENG.XIAO.YAN
* @version 1.0
* @Date 2019-12-18
*/
@Slf4j
public final class ModifyLogUtils {
/** 日志记录, eg: 修改xx: 由aa改为bb */
private static final String LOG_FORMAT_STRING = "修改[%s]: 由[%s]改为[%s]";
// 私有化构造方法
private ModifyLogUtils() {
}
/**
* 构建修改日志
* @param target 修改后的对象
* @param source 修改前的对象
* @return
*/
public static List<String> buildModifyLog(Object target, Object source) {
List<String> result = null;
if (Objects.isNull(target) || Objects.isNull(source)) {
return result;
}
Field[] declaredFields = target.getClass().getDeclaredFields();
try {
if (ArrayUtils.isNotEmpty(declaredFields)) {
result = new ArrayList<>();
for (Field field : declaredFields) {
ModifyLog modifyLog = field.getAnnotation(ModifyLog.class);
if (Objects.nonNull(modifyLog)) {
String compareResult = compareObject(field, target, source, modifyLog);
if (StringUtils.isNotBlank(compareResult)) {
result.add(compareResult);
}
}
}
}
} catch (Exception e) {
log.error("buildModifyLog 异常", e);
}
return result;
}
/**
* 比较2个对象里面的字段值不同
* @param field
* @param target
* @param source
* @param modifyLog
* @return
* @throws Exception
*/
private static String compareObject(Field field, Object target, Object source, ModifyLog modifyLog) throws Exception {
String alias = modifyLog.alias();
String name = modifyLog.name();
field.setAccessible(true);
Object targetValue = field.get(target);
Object sourceValue = getFieldValue(StringUtils.isBlank(alias) ? field.getName() : alias, source);
// t= null && s !=null
if (Objects.isNull(targetValue) && Objects.nonNull(sourceValue)) {
return String.format(LOG_FORMAT_STRING, name, customToString(sourceValue), customToString(targetValue));
} else if (Objects.nonNull(targetValue) && !targetValue.equals(sourceValue)){
return String.format(LOG_FORMAT_STRING, name, customToString(sourceValue), customToString(targetValue));
} else {
return null;
}
}
/**
* 暴力反射获取对象字段值
* @param fieldName
* @param object
* @return
*/
private static Object getFieldValue(String fieldName, Object object) {
try {
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(object);
} catch (Exception e) {
log.error("getFieldValue 异常", e);
}
return null;
}
private static String customToString(Object obj) {
if (null == obj) {
return "null";
} else if (obj instanceof java.util.Date){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) obj);
} else {
return obj.toString();
}
}
public static void main(String[] args) {
KeyEditDTO editDTO = new KeyEditDTO();
editDTO.setDepaCode("111111");
editDTO.setDepaName("21111");
editDTO.setKeySecret("3111");
editDTO.setKeyValidDate(new Date());
KeyDO keyDO = new KeyDO();
keyDO.setDepaCode("2222");
keyDO.setDepaName("3333");
keyDO.setKeySecret("4444");
keyDO.setKeyValidDate(null);
List<String> list = buildModifyLog(editDTO, keyDO);
list.forEach(System.out::println);
// 结果
// 修改[单位名字]: 由[3333]改为[21111]
// 修改[授权码]: 由[4444]改为[3111]
// 修改[到期时间]: 由[null]改为[2019-12-18 16:12:13]
}
}
使用:
List<String> basicLogList = ModifyLogUtils.buildModifyLog(keyEditDTO, keyDO);
keyEditDTO:
@Data
public class KeyEditDTO extends BaseDTO {
@ModifyLog(name = "授权码")
private String keySecret;
...