Printemps de Démarrage ConflictingBeanDefinitionException: Annotation-spécifié bean nom de @Contrôleur de classe
Je reçois le ConflictingBeanDefinitionException erreur dans mon Printemps de démarrage de l'application. Je ne suis pas entièrement sûr de la façon de l'aborder, j'ai plusieurs @Configuration annoté classes aidant à mettre en place Thymeleaf, le Printemps de Sécurité et de Web. Pourquoi la demande d'essayer de configuration du contrôleur homeController deux fois? (et où est-il en essayant de le faire?)
L'erreur est:
org.springframework.beans.factory.BeanDefinitionStoreException:
Failed to parse configuration class [org.kemri.wellcome.hie.Application]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'homeController' for bean class [org.kemri.wellcome.hie.HomeController] conflicts with existing, non-compatible bean definition of same name and class [org.kemri.wellcome.hie.controller.HomeController]
Mon ressort de démarrage de l'application principale de l'initialiseur:
@EnableScheduling
@EnableAspectJAutoProxy
@EnableCaching
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}
Ma base de données fichier de config:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages="org.kemri.wellcome.hie.repositories")
@PropertySource("classpath:application.properties")
public class DatabaseConfig {
@Autowired
private Environment env;
@Autowired
private DataSource dataSource;
@Autowired
private LocalContainerEntityManagerFactoryBean entityManagerFactory;
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("spring.datasource.driverClassName"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactory =
new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource(dataSource);
//Classpath scanning of @Component, @Service, etc annotated class
entityManagerFactory.setPackagesToScan(
env.getProperty("spring.jpa.hibernate.entitymanager.packagesToScan"));
//Vendor adapter
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
entityManagerFactory.setJpaVendorAdapter(vendorAdapter);
//Hibernate properties
Properties additionalProperties = new Properties();
additionalProperties.put(
"hibernate.dialect",
env.getProperty("spring.jpa.hibernate.dialect"));
additionalProperties.put(
"hibernate.showsql",
env.getProperty("spring.jpa.hibernate.showsql"));
additionalProperties.put(
"hibernate.hbm2ddl.auto",
env.getProperty("spring.jpa.hibernate.hbm2ddl.auto"));
entityManagerFactory.setJpaProperties(additionalProperties);
return entityManagerFactory;
}
@Bean
public JpaTransactionManager transactionManager() {
JpaTransactionManager transactionManager =
new JpaTransactionManager();
transactionManager.setEntityManagerFactory(
entityManagerFactory.getObject());
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
Mon Thymeleaf fichier de config:
@Configuration
public class ThymeleafConfig {
@Bean
public ServletContextTemplateResolver templateResolver(){
ServletContextTemplateResolver thymeTemplateResolver = new ServletContextTemplateResolver();
thymeTemplateResolver.setPrefix("/WEB-INF/views/");
thymeTemplateResolver.setSuffix(".html");
thymeTemplateResolver.setTemplateMode("HTML5");
return thymeTemplateResolver;
}
@Bean
public SpringSecurityDialect springSecurityDialect(){
SpringSecurityDialect dialect = new SpringSecurityDialect();
return dialect;
}
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addTemplateResolver(templateResolver());
Set<IDialect> dialects = new HashSet<IDialect>();
dialects.add(springSecurityDialect());
engine.setAdditionalDialects(dialects);
return engine;
}
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setViewClass(ThymeleafTilesView.class);
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
}
Ma configuration Web de classe:
@Configuration
@PropertySource("classpath:application.properties")
public class WebConfig extends WebMvcAutoConfigurationAdapter {
@Autowired
private Environment env;
@Bean
public JavaMailSenderImpl javaMailSenderImpl() {
JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
mailSenderImpl.setHost(env.getProperty("smtp.host"));
mailSenderImpl.setPort(env.getProperty("smtp.port", Integer.class));
mailSenderImpl.setProtocol(env.getProperty("smtp.protocol"));
mailSenderImpl.setUsername(env.getProperty("smtp.username"));
mailSenderImpl.setPassword(env.getProperty("smtp.password"));
Properties javaMailProps = new Properties();
javaMailProps.put("mail.smtp.auth", true);
javaMailProps.put("mail.smtp.starttls.enable", true);
mailSenderImpl.setJavaMailProperties(javaMailProps);
return mailSenderImpl;
}
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager();
}
}
Mon contrôleur (où il y a une erreur de configuration du contrôleur)
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "index.html";
}
}
Ce qui pourrait être à l'origine du ConflictingBeanDefinitionException erreur de ma classe de contrôleur?
Qui n'a pas fonctionné. J'obtiens toujours la même erreur.
mvn clean et reconstruire le projet .....Il a travaillé pour moi.
1) Supprimer des dossiers: construction et ; 2) Gradle: propre et actualiser.
OriginalL'auteur Timothy Tuti | 2015-02-13
Vous devez vous connecter pour publier un commentaire.
J'ai rencontré le même problème, mais pour une raison différente.
Cela peut également se produire si vous déplacez vos classes autour de votre projet et ne parviennent pas à faire une "clean".
- Je utiliser gradle avec spring-boot plugin. Maintenant j'ai l'habitude de courir:
putain l'homme.. vous avez sauvé la journée. J'étais sur le point de devenir fou
C'est la bonne réponse dans mon cas!! Merci!!!!!
OriginalL'auteur mchlstckl
La solution que j'ai trouvé, est de désactiver le double de l'initialisation en incluant un filtre dans le composant d'analyse. Dans mon cas:
OriginalL'auteur Timothy Tuti
J'ai eu le même problème sur un Ressort test d'intégration quand je l'ai couru avec InteliJ.
Après un peu de remaniement, l'un de mes contrôleur de classe était en fait un double dans le //production/classes répertoire par défaut est le répertoire de sortie pour Intelij depuis la version 2017.2.
Depuis le gradle répertoire de sortie est différent (C'est build/classes), le gradle propre objectif n'a eu aucun effet.
Pour moi la solution a été de supprimer manuellement //production/classes et ré exécuter mon test d'intégration.
Pour une possible solution durable ne pas avoir 2 sortie répertoires voir ici
OriginalL'auteur user3793803
Il semble que vous avez deux entityManagerFactory, vous autowire et un, vous résoudre par programmation comme Bean:
Je pense que vous avez juste besoin de votre configuré en Usine dans entityManagerFactory() la méthode.
Vous n'avez pas besoin de surcharger la méthode configure () dans votre Classe d'Application, parce que votre Classe est elle-même une Application.
J'ai supprimé la configuration de la fonction dans la classe d'application principal et je reçois toujours le même message d'erreur.
Peut-être que le entityManagerFactory.setPackagesToScan() et @ComponentScan annotation fait le même travail et créer le conflit que vous avez.
OriginalL'auteur sven.kwiotek
J'ai eu le même problème avec un générés .la guerre de fichier à partir du printemps-boot. la solution approuvée (Timothy Tuti solution propre) n'a pas assez de travail pour moi exactement comme-est, mais j'ai modifié un peu et ça a fonctionné. Je viens d'ajouter la ligne suivante à mon Application.java:
@ComponentScan(basePackages = { "com.mypackage" })
Pour référence, voici mon plein Application.java
OriginalL'auteur lotif