springboot 使用自定义注解校验传入参数

eg:获取传入学生年纪,小于25不通过。 

主要分两步骤:

             1. 自定义注解

              2.AOP  切面拦截

1、pom.xml   引入相关依赖

        <!-- 引入aop 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <!-- aspect 依赖  -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
        </dependency>

        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.6</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.27</version>
        </dependency>

2、实现自定以注解 (具体注解就不多做解释)

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented  //-- 生成javadoc 文档
// @Inherited  --子类拥有父类的注解 @Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
public @interface StudentAnnotion {

    String name() ;
    int age() default 18;

}

3、使用该注解

import com.bfy.demo.annotation.StudentAnnotion;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试注解
 */
@RestController
public class TestAnnotationController {

    @RequestMapping( value = "man")
    @StudentAnnotion(name = "莉莉",age = 25)  
    public String firstTest (@RequestParam  String name,@RequestParam int age ) {
        return name + age;
    }


}

4、创建切面对该注解拦截

import com.bfy.demo.annotation.StudentAnnotion;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class StudentAnnotionspect {

    @Pointcut("@annotation(com.bfy.demo.annotation.StudentAnnotion)")  // 切入点 为该注解
    private void pointcut() {
    }

    @Around("pointcut() &&  @annotation(studentAnnotion) ")
    public Object around(ProceedingJoinPoint joinPoint, StudentAnnotion studentAnnotion) throws Throwable {

        // 获取传递参数
        Object[] args = joinPoint.getArgs();
        Integer age = (Integer) args[1];
        if (studentAnnotion.age() > age) {
            return "年纪太小";
        }
        return joinPoint.proceed();
    }

}

5、效果显示

合适         

猜你喜欢

转载自blog.csdn.net/bfy0914/article/details/102507985