自定义注解 参数判空(注解+AOP)
(AOP相关依赖需要在pom文件中自行导入)
一、创建自定义注解 CheckNull
1、新建 @interface 文件 checkNull (可以先创建.java文件后将class文件改成@interface即可)
2、关于@Retention、@Documented、@Target详情去看 元注解。 传送门:https://blog.csdn.net/liang100k/article/details/79515910
package org.jeecg.modules.portal.anno;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.METHOD, ElementType.TYPE,ElementType.PARAMETER})
public @interface CheckNull {
}
二、创建切面(AOP)
1、加上@Aspect
2、定义切点@Pointcut(”@annotation(注解路径)“)
@annotation可以理解为切点在一个注解上
@Before 前置增强
@Around 环绕增强
@after 后置增强
具体去看相关文章:https://blog.csdn.net/zhanglf02/article/details/78132304
3.在环绕增强中写判空的逻辑( Result 为自己封装的统一返回结果,也可以直接抛出一个异常)
附源码:
package org.jeecg.modules.portal.aop;
import cn.hutool.core.util.StrUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.jeecg.common.api.vo.Result;
import org.springframework.stereotype.Component;
@Aspect
@Component
@SuppressWarnings({"unused"})
public class MyAspect {
@Pointcut("@annotation(org.jeecg.modules.portal.anno.CheckNull)") //自定义切点-->(作用于哪里)
public void annotationPointcut() {
}
@Before("annotationPointcut()") //进入方法前的操作
public void before(JoinPoint joinPoint) {
}
@Around("annotationPointcut()")
public Object round(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String[] params = signature.getParameterNames();//获取所有的参数名称
Object[] args = joinPoint.getArgs();//获取所有的参数值
int length = args.length;
for (int i = 0; i <length ; i++) {
String s = args[i].toString();
if(StrUtil.isEmpty(s)){
String msg = "参数"+params[i]+"不能为空";
return Result.error(msg);
}
}
return joinPoint.proceed();
}
}
三、实例测试
1、在控制器上加上创建好的注解 @CheckNull
/**
* 测试用的接口
*
*/
@ApiOperation(value="测试接口", notes="测试接口")
@PutMapping(value = "/testA")
@CheckNull
public Result<String> testA(@RequestParam(name = "a",required = false) String a,
@RequestParam(name = "b",required = false)String b) {
return Result.OK("");
}
测试结果:
小白。。 功能还待完善。。