34
votes

Le bean 'metaDataSourceAdvisor', défini dans null, n'a pas pu être enregistré

J'ai mis à jour la version Spring Boot de 2.0.3 à 2.1.1 mais j'obtiens ceci:

2019-01-06 07:33:39.282  INFO 29626 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-01-06 07:33:39.282  INFO 29626 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2019-01-06 07:33:39.912  INFO 29626 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-01-06 07:33:39.997  INFO 29626 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 80ms. Found 23 repository interfaces.
2019-01-06 07:33:39.999  WARN 29626 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'metaDataSourceAdvisor' defined in null: Cannot register bean definition [Root bean: class [org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'metaDataSourceAdvisor': There is already [Root bean: class [org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
2019-01-06 07:33:40.008  INFO 29626 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-01-06 07:33:40.010 ERROR 29626 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

J'obtiens l'erreur - le problème est que defined in null n'est pas vraiment un bon pointeur vers où chercher. J'ai vu cette question, mais je préférerais continuer à interdire le remplacement des beans ambigus.

Des idées?


Sortie de journal

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'metaDataSourceAdvisor', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true


0 commentaires

3 Réponses :


64
votes

D'accord, j'ai trouvé le problème moi-même: j'avais @EnableGlobalMethodSecurity deux fois dans mon projet:

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"mz.server.spring.repository"})
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) // <--
@EntityScan(basePackages = "mz.server.hibernate.model")
@EnableTransactionManagement
@EnableScheduling
public class Application {
}

et

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // <--
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}

C'est donc une nouvelle fonctionnalité intéressante de Spring Boot, je dirais.

Faites attention aux annotations en double indésirables si vous voyez ce type d'erreur.


0 commentaires

23
votes

Extension de la réponse acceptée, conformément aux notes de publication de Spring Boot 2.1

Le remplacement de bean a été désactivé par défaut pour éviter qu'un bean ne soit accidentellement remplacé. Si vous comptez sur la substitution, vous devrez définir spring.main.allow-bean-definition-overriding sur true.

Donc, si vous avez utilisé @EnableGlobalMethodSecurity plus d'une fois dans votre base de code et que ces beans font partie de la même analyse de composant, cette annotation tentera de créer le bean metaDataSourceAdvisor plus d'une fois. Cela lèvera une exception lors de l'initialisation.

Cela s'appliquera également aux autres annotations de configuration automatique qui créent des beans. Assurez-vous de n'utiliser leurs annotations d'activation qu'une seule fois .


0 commentaires

-1
votes

Peut aider à «nettoyer» et «construire» un projet dans Gradle ou Maven.


3 commentaires

Ce n'est pas une réponse valable à la question.


pouvez-vous poster quelques détails s'il vous plaît?


J'ai fait face au même problème comme auteur. J'utilise Gradle et j'ai nettoyé mon projet, puis le reconstruire et cela m'a aidé.