再业务开发中经常以为一些关键属性的前后空格问题,导致后端业务逻辑不能正常处理,如果每个接口单独trim,代码繁琐太容易遗漏,因此需求想要全局对关键属性trim, 比如在我们的对外接口中, providerId , 和 parkingId 是对用户身份的关键验证,所以需要对这两个属性做全局trim 。
1:申明切入点。
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MonitorLog {
/**
* 日志级别
* @return
*/
LogLevelEnum level() default LogLevelEnum.INFO ;
}
2:定义切面:
@Aspect
@Component
@Slf4j
public class MonitorLog1Aspect {
/**
* 切点
*/
@Pointcut("@annotation(com.dsx.MonitorLog)")
public void monitorLog() {
}
@Around("monitorLog()")
public Object interceptMonitorLogMethod(ProceedingJoinPoint point) throws Throwable {
Object[] args = point.getArgs();
for (int i = 0; i < args.length; i++) {
Field[] fields = args[i].getClass().getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
String type = field.getGenericType().toString();
String name = field.getName();
if (("providerId".equals(name) || "parkingId".equals(name) || "service_name".equals(name) || "parking_id".equals(name)) && "class java.lang.String".equals(type)) {
field.setAccessible(true);
// // 拼装get set方法 例如 setProviderId getProviderId
// String setMethodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
// String getMethodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
// //通过方法名称获取对应的方法,这里是获取字段的get方法
// Method getMethod = args[i].getClass().getMethod(getMethodName);
// // 获取set方法
// Method setMethod = args[i].getClass().getMethod(setMethodName, String.class);
// // 通过 invoke 获取到get方法的Value值 PS: invoke()方法就是用来执行指定对象的方法
// String value = (String) getMethod.invoke(args[i]);
// // 再invoke 执行 set方法 StringUtils.trim 对空格进行处理
// setMethod.invoke(args[i], StringUtils.trim(value));
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), args[i].getClass());
Method getMethod = pd.getReadMethod();
Method setMethod = pd.getWriteMethod();
String value = (String) getMethod.invoke(args[i]);
setMethod.invoke(args[i], StringUtils.trim(value));
}
}
}
Object result = point.proceed();
return result;
}
我这里是直接嵌入到 链路日志aop里面统一处理,删减了日志代码整理的文档,使用过程中根据自己的需求自定义名称即可。 切面中的处理逻辑,注释部分的代码和 下面的代码可以达到同样的效果,看个人喜欢选择。