【问题标题】:I want to make a aspect which will take effect when i add a annotation on the type and method,but failed我想制作一个方面,当我在类型和方法上添加注释时生效,但失败了
【发布时间】:2021-04-17 13:12:23
【问题描述】:

我想制作一个方面,当我在类型和方法上添加注释时会生效。 方面类:

@Component
@Aspect
public class ActionUnlockAspect {
    @Before("@target(com.example.demo.aspect.ActionUnlockCheck)||@annotation(com.example.demo.aspect.ActionUnlockCheck)")
    public void check(JoinPoint joinPoint) {
         //do something...
    }

}

注解类

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(ActionUnlockChecks.class)
public @interface ActionUnlockCheck {
    int actionType();
}

我使用 springboot 版本 2.1.7.RELEASE。 当我启动 springboot 项目时,发生错误。这是堆栈跟踪:

Caused by: java.lang.IllegalArgumentException: Cannot subclass final class com.sun.jmx.mbeanserver.JmxMBeanServer
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:660) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.ClassLoaderAwareGeneratorStrategy.generate(ClassLoaderAwareGeneratorStrategy.java:57) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:358) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:585) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:110) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) ~[spring-core-5.3.4.jar:5.3.4]
    at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) ~[na:1.8.0_251]
    at java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:1.8.0_251]
    at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:572) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:419) ~[spring-core-5.3.4.jar:5.3.4]
    at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57) ~[spring-aop-5.3.4.jar:5.3.4]
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:206) ~[spring-aop-5.3.4.jar:5.3.4]
    ... 102 common frames omitted

【问题讨论】:

  • 是否添加相关依赖,spring-boot-starter-aop

标签: java spring-boot aop


【解决方案1】:

看起来您的切入点过于全球化。正如所记录的,@target() 只能在运行时评估,因此该方面基本上适用于所有类。一种方法是改用@within()。如果这不起作用,您还可以添加 ... && within(my.own.app..*) 之类的内容以限制方面范围。

【讨论】:

  • 在 SO 上感谢人们的方式是将正确答案标记为已接受(单击答案旁边的灰色复选标记,使其变为绿色),如果有帮助,请点赞 cmets 或答案。不过,您需要先获得一些声望点,然后才能投票。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2018-02-18
  • 2013-03-30
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 2016-03-18
相关资源
最近更新 更多