Bootstrap

自定义注解 参数判空(注解+AOP)

自定义注解 参数判空(注解+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("");
    }

测试结果:

在这里插入图片描述
小白。。 功能还待完善。。

;