AOP 全局trim关键属性

再业务开发中经常以为一些关键属性的前后空格问题,导致后端业务逻辑不能正常处理,如果每个接口单独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里面统一处理,删减了日志代码整理的文档,使用过程中根据自己的需求自定义名称即可。 切面中的处理逻辑,注释部分的代码和 下面的代码可以达到同样的效果,看个人喜欢选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值