Springboot+自定义注解+自定义AOP前置增强+自定义异常+自定义异常捕获

开篇

想要在一些方法执行之前要进行一个逻辑判断,

想到使用AOP的前置增强自定义异常自定义异常捕获可以解决这个问题,

一次性用了这么多,就是想把之前比较模糊的东西重新拿起来

1.我们先自定义一个注解

 /**
  * @program: shiro-demo
  * @description: 自定义注解
  * @author: @DogElder
  * @create: 2020-04-18 20:42
  **/
  @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface TestAnnotation {
 }

 

2.自定义一个异常类

  我们首先要先导入AOP依赖

1 <!--aop-->
2 <dependency>
3     <groupId>org.springframework.boot</groupId>
4     <artifactId>spring-boot-starter-aop</artifactId>
5 </dependency>

 

 import lombok.Data;
  /**
  * @program: shiro-demo
  * @description: 自定义异常类
  * @author: @DogElder
  * @create: 2020-04-18 21:11
  * 要继承RuntimeException
  **/
 @Data
 public class TestExcption extends RuntimeException {
     
     private String code;
     private String message;
     
 //    这个地方需要写一个有参构造
     public TestExcption(String code, String message) {
         this.code = code;
         this.message = message;
     }
 }

 

异常捕获

/**
  * @program: shiro-demo
  * @description: 异常处理
  * @author: @DogElder
  * @create: 2020-04-18 21:20
  **/
 @RestControllerAdvice
 public class TestExceptionHandler {
       /**
    * @Description: 异常捕获
     * @Param: java.util.Map<java.lang.String,java.lang.Object>
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     * @Author:@Dog_Elder
     * @Date: 2020/4/18
     */
     @ExceptionHandler(TestExcption.class)
     public Map<String, Object> handleCustomException(TestExcption customException) {
         Map<String, Object> error = new HashMap<>();
         error.put("code", customException.getCode());
         error.put("message", customException.getMessage());
         return error;
     }
 }

 

 

3.然后我们自定义一个切面类

 /**
  * @program: shiro-demo
  * @description: 自定义切面
  * @author: @DogElder
  * @create: 2020-04-18 20:49
  **/
@Configuration
 @Aspect
 public class TestAop {
      
     /**
      * @Description: 声明一个切入点
      * @Param: void
      * @return: void
      * @Author:@Dog_Elder
      * @Date: 2020/4/18
      * @Pointcut 声明一个切入点 参数为切点表达式
     * 注意: 这里的切入点是@annotation注解类的全路名 (看你们声明的切入点是在那里进行更换)
      */
     @Pointcut("@annotation(com.shiro.shiro_demo.config.annotation.TestAnnotation)")
     public void testPointCut() {
      }
      /**
     * @Description: 声明一个前置增强
     * @Param: void
      * @return: void
      * @Author:@Dog_Elder
      * @Date: 2020/4/18
      * @Before 前置增强 参数为切点方法
      * 注意:抛异常 抛异常 抛异常 throws RuntimeException   和 throw
      *
      */
     @Before("testPointCut()")
     public void testBefore() throws RuntimeException{
 //        这里可以实现你的逻辑代码 (因为是demo)
 //        我就写一个简单的小例子
         int n=1;
         if (n!=0) {
             //这个地方就是我们写的自定义的异常
            throw  new TestExcption("401","无权限");
         }
     }
     
 }

 

测试

 

 

 

END

posted @ 2020-04-18 22:04  DogElder  阅读(946)  评论(0编辑  收藏  举报