我想做一个方面,当我在类型和方法上添加注释时会生效,但失败了
I want to make a aspect which will take effect when i add a annotation on the type and method,but failed
我想制作一个方面,当我在类型和方法上添加注释时,它会生效。
看点 class:
@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...
}
}
注解class
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(ActionUnlockChecks.class)
public @interface ActionUnlockCheck {
int actionType();
}
我用的是springboot 2.1版本7.RELEASE。
当我启动 springboot 项目时,错误 occur.here 是堆栈跟踪:
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.apply(AbstractClassGenerator.java:110) ~[spring-core-5.3.4.jar:5.3.4]
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.apply(AbstractClassGenerator.java:108) ~[spring-core-5.3.4.jar:5.3.4]
at org.springframework.cglib.core.internal.LoadingCache.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
看起来你的切入点太全球化了。由于 @target()
只能在运行时评估,如文档所述,方面基本上适用于所有 类。一种方法是改用 @within()
。如果这不起作用,您还可以添加类似 ... && within(my.own.app..*)
的内容以限制方面范围。
我想制作一个方面,当我在类型和方法上添加注释时,它会生效。 看点 class:
@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...
}
}
注解class
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Repeatable(ActionUnlockChecks.class)
public @interface ActionUnlockCheck {
int actionType();
}
我用的是springboot 2.1版本7.RELEASE。 当我启动 springboot 项目时,错误 occur.here 是堆栈跟踪:
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.apply(AbstractClassGenerator.java:110) ~[spring-core-5.3.4.jar:5.3.4]
at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.apply(AbstractClassGenerator.java:108) ~[spring-core-5.3.4.jar:5.3.4]
at org.springframework.cglib.core.internal.LoadingCache.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
看起来你的切入点太全球化了。由于 @target()
只能在运行时评估,如文档所述,方面基本上适用于所有 类。一种方法是改用 @within()
。如果这不起作用,您还可以添加类似 ... && within(my.own.app..*)
的内容以限制方面范围。