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";
}