Spring - конфликтует с существующим, несовместимым определением бина с тем же именем и классом
Конкретное исключение:
Failed to instantiate [org.springframework.context.annotation.AnnotationConfigApplicationContext]: Constructor threw exception;
nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'myService' for bean class [my.package.ejb.MyService] conflicts with existing, non-compatible bean definition of same name and class [my.package.other.ejb.MyService]
Те MyService
интерфейсы даже не аннотированы, они представляют EJB 2.0 bean-компоненты без состояния.
Моя конфигурация аннотации следующая.
@Configuration
@ComponentScan("my.package")
@MapperScan("my.package")
public class ApplicationConfiguration {
@Bean
public DataSource dataSource() {
return new JndiDataSourceLookup().getDataSource("...");
}
@Bean
public SqlSessionFactoryBean sqlSessionFactory(final DataSource dataSource) {
final SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
sqlSessionFactory.setConfigLocation(new ClassPathResource("..."));
return sqlSessionFactory;
}
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(final DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
Может быть несовместимость с @MapperScan
(от MyBatis) и @ComponentScan
?
Исключение составляют SpringBeanAutowiringInterceptor
Я использую для Autowire EJB 3.0 поля.
2 ответа
Документация для MapperScannerConfigurer
Говорит, что:
Этот класс поддерживает фильтрацию отображений, созданных либо указанием интерфейса маркера, либо аннотацией. Свойство annotationClass указывает аннотацию для поиска. Свойство markerInterface указывает родительский интерфейс для поиска. Если указаны оба свойства, сопоставители добавляются для интерфейсов, соответствующих любому из критериев. По умолчанию эти два свойства являются нулевыми, поэтому все интерфейсы в данном basePackage добавляются как преобразователи.
В основном я отображал тысячи интерфейсов как бины. Не круто!
Ребята, моя вина.
Ошибка предполагает, что у вас есть два компонента с одинаковым именем (myService
) но не совместимы:
my.package.ejb.MyService
my.package.other.ejb.MyService
В этом случае вы должны определить свое уникальное имя для ваших bean-компонентов:
@Bean(name = "myService1")
@Component
public MyService {
... Define another name for other service