springAop处理异常参数问题

Aop切面处理异常参数,有些接口需要参数string类型,但是往往有些xx同事传参数非要传成null字

符串,这个时候需要将null字符串转一下。

第一步:引入依赖:

<!-- aspectj-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
</dependency>    

第二步:写一个自定义注解

package com.generator.code.config2;

import java.lang.annotation.*;

/**
 * @Author candy
 * @Description TODO
 * @Date 2021/6/10 16:52
 * @Version 1.0
 */
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface HandlerParam {
}

第三步:实现切面逻辑

package com.generator.code.config2;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
 * @Author candy
 * @Description TODO
 * @Date 2021/6/10 16:54
 * @Version 1.0
 */
@Aspect
@Component
public class HandlerParamAspect {

    @Pointcut("@annotation(com.generator.code.config2.HandlerParam)")
    public void HandlerParamPointcut() {
    }

    @Around("HandlerParamPointcut()&&@annotation(handlerParam)")
    public Object HandlerParamAround(ProceedingJoinPoint pc, HandlerParam handlerParam) {
        long startTime = System.currentTimeMillis();
        try {
            MethodSignature signature = (MethodSignature) pc.getSignature();
            //获取切入方法的对象
            Method method = signature.getMethod();
            //获取参数值
            Object[] args = pc.getArgs();
            //获取参数名
            DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
            String[] parameterNames = discoverer.getParameterNames(method);
            //对这些参数名进行遍历,找到我们要修改的参数,获取到这个参数名在数组中的下标,并将我们需要赋的值放到参数值数据的相应位置,进行参数替换。
            for (int i = 0; i < parameterNames.length; i++) {
                System.out.println(parameterNames[i]);
                System.out.println(args[i]);
                if (args[i] == null || (args[i] != null && args[i].equals("null"))) {
                    args[i] = "";
                }
            }
            System.out.println("============" + (System.currentTimeMillis() - startTime));
            //执行程序,带上修改过的参数
            Object proceed = pc.proceed(args);
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return null;
    }
}

第四步、运用:在你的controller接口上加上自定义注解即可

    @HandlerParam
    @GetMapping("/test2")
    public String test2(String username, String passWord) {
        if (username == null) {
            System.out.println("=======");
        } else {
            System.out.println(username);
        }
        return "success";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值