Сегодня я попытался обновить наше приложение с 2.0.6.RELEASE->2.1.1.RELEASE
, но оно больше не запускается из-за:
org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.context.config.internalBeanConfigurerAspect' defined in class path resource [org/springframework/context/annotation/aspectj/SpringConfiguredConfiguration.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration; factoryMethodName=beanConfigurerAspect; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/context/annotation/aspectj/SpringConfiguredConfiguration.class]] for bean 'org.springframework.context.config.internalBeanConfigurerAspect': There is already [Root bean: class [org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=aspectOf; initMethodName=null; destroyMethodName=null] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:894)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:274)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:141)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:117)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:327)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:691)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:528)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
Сначала я думал, что это из-за ошибки в данных Spring, но это ужеисправлено в этом выпуске ( ошибка бросков переопределения bean-компонентов Spring в JpaAuditingRegistrar ).
Когда я отлаживаю последовательность запуска, я вижу, что JpaAuditingRegistrar
первым регистрирует бин с именем org.springframework.context.config.internalBeanConfigurerAspect
тогда следующий класс, который заставляет бин быть зарегистрирован с этим именем, будет SpringConfiguredConfiguration
.
Что еще я мог бы исследовать, чтобы решить эту проблему?Я стремлюсь не просто разрешить переопределение бобов, но разве это единственный выход из этого?
Некоторые соответствующие классы конфигурации пружин:
AopConfig
@Configuration
@EnableSpringConfigured
public class AopConfig {
/**
* Ensure that all critical aspects have been configured.
* This method will blow up if they are not.
*/
@PostConstruct
public void postConstruct() {
Aspects.aspectOf(AnnotationBeanConfigurerAspect.class);
}
}
JpaConfig
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@EnableJpaRepositories(repositoryBaseClass = BaseJpaDaoImpl.class, basePackages = "com.xxx")
@EnableJpaAuditing(auditorAwareRef = "auditorProvider", dateTimeProviderRef = "auditingDateTimeProvider")
@EntityScan("com.xxx")
@Configuration
public class JpaConfig {
@NotNull
@Bean
public AuditorAware<String> auditorProvider() {
return new JpaAuditorAwareImpl();
}
@NotNull
@Bean(name = "auditingDateTimeProvider")
public DateTimeProvider auditingDateTimeProvider() {
return () -> Optional.of(ZonedDateTime.now());
}
}
Приложение
@SpringBootApplication(scanBasePackages = "com.xxx")
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
@EnableAsync
@EnableScheduling
public class Application extends SpringBootServletInitializer { ... }
Другая информация:
- Java 8
- Spring-Cloud Greenwich.RC2
- spring-boot-starter-data -asticsearch
Выход из debug=true
:
https://gist.github.com/oliverhenlich/69a253e253dfd7c0189fc472f00705ad