spring aop @target и @within throw IllegalAccessError - PullRequest
0 голосов
/ 02 мая 2020

при запуске приложения выдается IllegalAccessError failed Ошибка запуска приложения

здесь приведена демонстрационная версия 、 служба used используется аннотация , простая аннотация и @Before advice , также включить @ EnableAspectJAutoProxy

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

@Component
@Aspect
public class MethodInterceptAop {
    @Before("@target(com.example.demo.aop.MethodInterceptAnnotation)")
    public void beforeCheck() {
        System.out.println("before check");
    }
}

public interface UserService {
    String getUserName(int a);
}

@Service
public class UserServiceImpl implements UserService {
    @MethodInterceptAnnotation
    public String getUserName(int age) {
        System.out.println("age:" + age);
        return age + "";
    }
}

изменить @target на @within ошибка снова, но изменить @target на @annotation все в порядке

вот частичная трассировка стека

Caused by: org.springframework.cglib.core.CodeGenerationException: java.lang.IllegalAccessError-->class org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat$$EnhancerBySpringCGLIB$$e5c9e457 cannot access its superclass org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:538) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator.generate(AbstractClassGenerator.java:363) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.proxy.Enhancer.generate(Enhancer.java:582) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:110) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData$3.apply(AbstractClassGenerator.java:108) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.internal.LoadingCache$2.call(LoadingCache.java:54) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_201]
    at org.springframework.cglib.core.internal.LoadingCache.createEntry(LoadingCache.java:61) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.internal.LoadingCache.get(LoadingCache.java:34) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator$ClassLoaderData.get(AbstractClassGenerator.java:134) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:319) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:569) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.cglib.proxy.Enhancer.createClass(Enhancer.java:416) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.aop.framework.ObjenesisCglibAopProxy.createProxyClassAndInstance(ObjenesisCglibAopProxy.java:57) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205) ~[spring-aop-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 37 common frames omitted
Caused by: java.lang.IllegalAccessError: class org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat$$EnhancerBySpringCGLIB$$e5c9e457 cannot access its superclass org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
    at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_201]
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:535) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 51 common frames omitted

Кто-нибудь знает, что не так с этим кодом, спасибо заранее.

1 Ответ

1 голос
/ 02 мая 2020

Из документации: Поддерживаемые указатели Pointcut

@ target: Пределы совпадения для точек соединения (выполнение методов при использовании Spring AOP), где находится класс исполняемого объекта имеет аннотацию заданного типа.

@ within: Ограничения, совпадающие с точками соединения внутри типов, имеющих данную аннотацию (выполнение методов, объявленных в типах с данной аннотацией при использовании Spring AOP).

Оба типа подсказок @target и @within предназначены для класса / типа.

Область действия pointcut является глобальной, и при запуске приложения оно пытается идентифицировать все классы / типы с аннотацией и создает помехи для нежелательных классов, здесь EmbeddedTomcat related.

For @target и @within типы советов для работы, попробуйте сузить область, добавив обозначение области видимости следующим образом

@Before("@target(com.example.demo.aop.MethodInterceptAnnotation) && within(com.example.demo..*)")

Для меня сужение области всегда работало, но пришло по SO вопросы , где то тоже не помогло. В этом случае решение вашей проблемы доступно в этом ответе от @kriegaex.

Пожалуйста, go через ответ и комментарии, чтобы понять разницу при использовании @annotation. Подводя итог, подсказки типов @target и @within, когда они используются, имеют тенденцию создавать прокси для всех классов, независимо от того, присутствует аннотация или нет на уровне класса.

Надеюсь, это поможет.

...