Spring Boot ConflictingBeanDefinitionException: Annotation angegebenen bean-name für @Controller class
Ich immer die ConflictingBeanDefinitionException Fehler in meinem Spring-boot-Anwendung. Ich bin mir nicht ganz sicher, wie es anzugehen, ich habe mehrere @ - Konfiguration annotierten Klassen helfen, einrichten, Thymeleaf, Spring Security und Web. Warum ist die Anwendung versucht, um den setup-homeController zweimal? (und wo ist es zu versuchen, dies zu tun?)
Der Fehler ist:
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]
Mein spring-boot-Haupt-Applikation-Initialisierung:
@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);
}
}
Meine Datenbank config-Datei:
@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();
}
}
Meine Thymeleaf config-Datei:
@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;
}
}
Meine Web-config-Klasse:
@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();
}
}
Mein controller (wo es ist ein Fehler das einrichten des Controllers)
@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";
}
}
Was könnte die Ursache des ConflictingBeanDefinitionException Fehler für meine controller-Klasse?
- Versuchen Sie, fügen Sie @EnableWebMvc auf Ihrem WebConfig.class
- Das hat nicht geklappt. Ich bekomme immer noch den gleichen Fehler.
- mvn clean und das Projekt neu erstellen .....Es funktionierte für mich.
- 1) Löschen von Ordnern: build und out; 2) Gradle: saubere und refresh.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lief in das gleiche problem aber aus einem anderen Grund.
Dies kann auch auftreten, wenn Sie Ihre Klassen in Ihrem Projekt und nicht als 'clean'.
Ich benutze gradle mit spring-boot-plugin. Jetzt habe ich in der Regel laufen:
Die Lösung, wie ich herausgefunden habe, ist das deaktivieren von Doppel-Initialisierung, indem Sie einen filter in der scan-Komponente. In meinem Fall:
Ich hatte das gleiche problem auf einem Spring-integration-test bei mir lief es mit InteliJ.
Nach einer Umgestaltung, einer meiner controller-Klasse war eigentlich doppelte in der /out/Produktion/Klassen - Verzeichnis, die Standard-Ausgabe-Verzeichnis für Intelij seit version 2017.2.
Da die gradle-Ausgabe-Verzeichnis ist anders (Es ist build/classes), die gradle clean Tor hatte keine Wirkung.
Für mich war die Lösung manuell zu entfernen /out/Produktion/Klassen und wieder laufen meine integration test.
Für eine mögliche, dauerhafte Lösung nicht mit 2 output-Verzeichnisse finden Sie hier
Es scheint, haben Sie zwei entityManagerFactory, die man autowire und Sie beheben programmgesteuert als Bean:
Ich denke, Sie müssen nur Ihre konfigurierten Fabrik in entityManagerFactory () - Methode.
Ich hatte das gleiche problem mit einem generierten .war-Datei von spring-boot. die bewährte Lösung (Timothy Tuti eigene Lösung) nicht so Recht funktionieren bei mir genau so ist, aber ich Zwickte es ein wenig und es funktionierte. Ich habe gerade die folgende Zeile in meine Application.java:
@ComponentScan(basePackages = { "com.mypackage" })
Referenz, hier geht meine volle Application.java