qq_29917909 2021-05-25 15:42 采纳率: 100%
浏览 738
已采纳

springboot 自定义注解和切面不生效

controller

@RestController
@RequestMapping("app/111")
public class test {

    /**
     * 登录界面开关
     * @return
     */
    @PostMapping("/loginOnOff1")
    @CheckForm(delaySeconds = 1,checkType = "sd")
    private ApiResult loginOnOff1() {
        System.out.println("测试");
        return null;

    }
}

注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckForm {

    int delaySeconds() default 5;

    String checkType() default "";
}

切面

@Aspect
@Component
@Slf4j
public class SubmitAspect {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private CommonCacheUtil cacheUtil;


    @Pointcut(value = "@annotation(com.fengou.common.annotation.CheckForm)")
    private void pointcut() {
        System.out.println("111111");
    }


    @Around("pointcut()&&@annotation(checkForm)")
    public Object around(ProceedingJoinPoint proceedingJoinPoint,CheckForm checkForm ) throws Throwable {

        Integer delaySeconds = checkForm.delaySeconds();

        String checkType = checkForm.checkType();
        UserElement ue;
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String token = request.getHeader(Constants.REQUEST_TOKEN_KEY);

        Boolean falg = redisTemplate.opsForValue().setIfAbsent(token+":"+checkType,1,delaySeconds, TimeUnit.SECONDS);
      //  boolean falg = true;
        if (falg){
            log.error("正确执行了");
            return proceedingJoinPoint.proceed();

        }else {
            log.error("错误执行了");
            return ApiResult.createByInfo(ResponseCode.SUBMIT_ERROR.getCode());
        }



    }
}
  • 写回答

2条回答 默认 最新

  • CSDN专家-毛惜时 2021-05-25 17:49
    关注

    aop的原理是动态代理,被拦截的方法不能是private,将方法loginOnOff1的private改为public就可以被拦截了。修改后的代码如下:

    @RestController
    @RequestMapping("app/111")
    public class test {
    
        /**
    
         * 登录界面开关
    
         * @return
    
         */
        @PostMapping("/loginOnOff1")
        @CheckForm(delaySeconds = 1,checkType = "sd")
        public ApiResult loginOnOff1() {
            System.out.println("测试");
            return null;
        }
    
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格