Объявление аспекта нарушает контекст - PullRequest
0 голосов
/ 07 августа 2020

У меня есть приложение SpringBoot, которое использует библиотеку (которую я не могу изменить), которая вводит bean-компонент типа «String» в таком контексте:

@Bean
public String someBean() {
         return "Some String";
}

Это не вызывает никаких проблем, пока Я объявляю такой аспект:

@Aspect
@Component
public class UseCaseAspect {

    @Around("@target(some.specific.annotation.MyAnnotation)")
    public Object doOperation(ProceedingJoinPoint pjp) {
        //Do nothing yet.
    }
}

Важно: аспект НЕ влияет на bean-компонент (потому что он влияет только на аннотированные bean-компоненты, и это настраиваемая аннотация, о которой библиотека, содержащая bean-компонент, даже не знает) ).

Когда Spring обнаруживает Аспект, что-то меняется в способе загрузки контекста Spring, потому что я получаю исключение, например:

Caused by: java.lang.IllegalArgumentException: Cannot subclass final class java.lang.String
    at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:657)
    at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)

Потому что он явно пытается проксировать bean-компонент someBean и он не может, потому что GCLIB не может создать подкласс bean-компонента (потому что это строка).

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'someBean' defined in class path resource [the/path/to/the/bean/MyClass.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class java.lang.String: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class java.lang.String
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)

Есть подсказка? Спасибо большое!

...