notapp 2021-10-18 16:57 采纳率: 100%
浏览 26
已结题

Spring Aspect 组合注解如何实现?

定义了4个注解,@ApiCheck注解中组合了@CheckOne,@CheckTwo,@CheckThree三个注解,三个注解都写了aspect切面环绕方法,现在在Controller类方法上标@ApiCheck注解,想要自动去调用执行@CheckOne,@CheckTwo,@CheckThree的切面环绕方法。但切入点始终无法匹配,请问如何修正?
@ApiCheck

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@CheckOne
@CheckTwo
@CheckThree
public @interface ApiCheck {
}

@CheckOne

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckOne {
}

@CheckTwo

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckTwo {
}

@CheckThree

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CheckThree {
}

ApiCheckAspect切面类切入点

@Around("execution(* com.xx.api.controller..*.*(..)) " +
            "&& @annotation(com.xx.api.annotation.ApiCheck) " +
            "&& (@annotation(org.springframework.web.bind.annotation.RequestMapping) " +
            "|| @annotation(org.springframework.web.bind.annotation.GetMapping) " +
            "|| @annotation(org.springframework.web.bind.annotation.PostMapping) " +
            "|| @annotation(org.springframework.web.bind.annotation.DeleteMapping) " +
            "|| @annotation(org.springframework.web.bind.annotation.PatchMapping)" +
            ")"
    )

CheckOneAspect切入点(Two和Three类似)

@Pointcut("( target(com.xx.api.annotation.ApiCheck) && " +
            "@annotation(com.xx.api.annotation.CheckOne) " +
            ") || " +
            "(execution(* com.xx.api.controller..*.*(..)) && " +
            "@annotation(com.xx.api.annotation.CheckOne) && (" +
            "@annotation(org.springframework.web.bind.annotation.RequestMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.GetMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.PostMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.DeleteMapping) || " +
            "@annotation(org.springframework.web.bind.annotation.PatchMapping) " +
            "))")
    private void aspectPointcut(){}

执行结果是 ApiCheckAspect 切入点进去了,但 CheckOne 的没有执行进去。请问这一句 target(com.xx.api.annotation.ApiCheck) && @annotation(com.xx.api.annotation.CheckOne) 指向 ApiCheck 组合注解同时注解上存在 CheckOne 注解的方式是怎么错的,并求正解解法。谢谢!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月26日
    • 创建了问题 10月18日

    悬赏问题

    • ¥15 onlyoffice编辑完后立即下载,下载的不是最新编辑的文档
    • ¥15 求caverdock使用教程
    • ¥15 Coze智能助手搭建过程中的问题请教
    • ¥15 12864只亮屏 不显示汉字
    • ¥20 三极管1000倍放大电路
    • ¥15 vscode报错如何解决
    • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
    • ¥15 python随机森林对两个excel表格读取,shap报错
    • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
    • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。