zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    tensorflow几个常见错误
    15、TDM模型
    算法97:成绩排名---动态规划
    推荐阅读论文
    Reservoir Sampling 蓄水池采样算法
    14、RALM: 实时 look-alike 算法在推荐系统中的应用
    NLP传统基础(3)---潜在语义分析LSA主题模型---SVD得到降维矩阵
    【SqlServer】SqlServer中的计算列
    【SQL】数据库中的五种约束
    【.NET】SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间
  • 原文地址:https://www.cnblogs.com/doge-elder/p/12728478.html
Copyright © 2011-2022 走看看