AspectJ компилирует время компиляции, генерирует исключение BeanInstantiationException для пружинных компонентов с конструктором только аргумента

У меня есть аспект аспекта в проекте Maven: мой аспект проекта

@Aspect
public class LoggingAspect {

    @Autowired
    public MessageSource messageSource

    @Pointcut("within(@Log *)")
    public void executionOfAnyMethodInLogAnnotationClass(){}

    @Before(value= "executionOfAnyMethodInLoggableAnnotationClass")
    public void logBefore(JointPoint jp){
        Logger.log(Level.info,messageSource.getMessage("before.log.message"),new String[] {
            jp.getTarget().getClass().getSimpleName(),
            jp.getSignature().getName(), 
            Arrays.deepToString(jp.getArgs())
        });
    }
}

Я использовал аспект j-maven-плагин для плетения времени компиляции в Maven, как показано ниже

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>${aspectj-maven-plugin-version}</version>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
<configuration>
<complianceLevel>${maven.compiler.source}</complianceLevel>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<showWeaveInfo>true</showWeaveInfo>
<forceAjcCompile>true</forceAjcCompile>
<verbose>true</verbose>
<Xlint>warning</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>com.mycompany-myproject</groupId>
<artifactId>my-aspect-project</artifactId>
</aspectLibrary>
</aspectLibraries>
</configuration>
</execution>
</executions>
</plugin>

Аспект работает, как и ожидалось, и совет вызывается всякий раз, когда метод или класс помечены как @Log называется.

Я использую приложение весенней загрузки, и не используется xml.

Я определил bean-компонент в моем Appconfig, как показано ниже, чтобы сделать пружину для установки зависимостей для аспекта, и это работает.

@Bean()
public LoggingAspect loggingAspect() {
    LoggingAspect loggerAspect =  Aspects.aspectOf(LoggingAspect.class);
    loggerAspect.messageSource = messageSource;//Autowired in same class
    return loggerAspect;
}

Но, если класс помечен @Log который имеет конструктор аргумента затем spring, при запуске сервера генерирует исключение BeanCreationException для @Log аннотированный класс

 @Log
 public class TypeBuilder {

     TypeBuilder(EnumType type, String value) { ... }

     public void build(){ ... }

 }

Исключение:

Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mycompany.TypeBuilder]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.mycompany.TypeBuilder.<init>()
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1101)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
        at com.mycompany.Application.main(Application.java:22)   

0 ответов

Другие вопросы по тегам