一.自定义注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CreateDateTime {
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CreatePerson {
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedAutoSetParam {
}
二.定义切面
@Aspect
@Component
public class AutoSetValueAspect {
@Pointcut("execution(* com.xxx..*(..)) && @within(org.springframework.web.bind.annotation.RestController)")
public void declareJoinPointExpression(){}
@Around("@annotation(autoSet)")
public Object aroundMethod(ProceedingJoinPoint pjd,NeedAutoSetParam autoSet) throws Throwable {
Object result = null;
try {
UserInfo userInfo = UserInfoContext.getUser();
for (Object argObj : pjd.getArgs()) {
this.setBaseInfo(argObj, argObj.getClass(), userInfo);
}
result = pjd.proceed();
} catch (Throwable e) {
throw e;
}
return result;
}
private void setBaseInfo(Object obj, Class clazz, UserInfo userInfo) {
if (!isTargetObj(obj)) {
return;
}
Arrays.stream(obj.getClass().getDeclaredFields())
.forEach(field -> {
Object fieldValue = getFieldValue(obj, field);
if (isTargetObj(fieldValue)) {
setBaseInfo(fieldValue, field.getType(), userInfo);
} else {
if (field.isAnnotationPresent(CreateDateTime.class) && field.getType().equals(Date.class)) {
setFieldValue(obj, field, new Date());
} else if (field.isAnnotationPresent(CreatePerson.class) && field.getType().equals(Integer.class)) {
setFieldValue(obj, field, userInfo.getUserId());
}
}
});
}
private boolean isTargetObj(Object object) {
if (object == null) {
return false;
}
if (object.getClass().getName().startsWith("com.fqkj")) {
return true;
}
return false;
}
private Object getFieldValue(Object obj, Field field) {
try {
field.setAccessible(true);
return field.get(obj);
} catch (Exception e) {
}
return null;
}
private void setFieldValue(Object obj, Field field, Object value) {
try {
field.setAccessible(true);
field.set(obj, value);
return;
} catch (Exception e) {
}
try {
char[] tmp = field.getName().toCharArray();
tmp[0] = Character.toUpperCase(tmp[0]);
String setter = "set" + new String(tmp);
obj.getClass().getMethod(setter).invoke(obj, value).toString();
return;
} catch (Exception e) {
}
}
}
三.使用实例
@Data
public class Test{
@CreateDateTime
private Date createTime;
@CreatePerson
private String createUserId;
@NeedAutoSetParam
@Transactional(rollbackFor = Exception.class)
public int testFun(Test test) {
System.out.pringln(test.getCreateTime);
System.out.pringln(test.getCreateUserId);
return "";
}