Базовый компонент DataSource в весенней загрузке 2.1

Я обновился до версии Spring Boot 2.1, и у меня появилось странное исключение при запуске приложения.

The bean 'dataSource', defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class], could not be registered. A bean with that name has already been defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class] and overriding is disabled.

Полное сообщение об ошибке:

[o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'dataSource' defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Cannot register bean definition [Root bean: class [org.springframework.aop.scope.ScopedProxyFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in BeanDefinition defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] for bean 'dataSource': There is already [Root bean: class [null]; scope=refresh; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=false; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Hikari; factoryMethodName=dataSource; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]] bound.

Бобы не должны быть переопределены в соответствии с нашей политикой, и она отключена:

spring.main.allow-bean-definition-overriding=false

У меня нет конфигурации источника данных в моем коде приложения. Единственный параметр, который вызывает эту ошибку: @EnableAutoConfiguration и в моих свойствах приложения я установил тип источника данных:

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

Загрузочное приложение инициализируется

@SpringBootApplication
@EnableAutoConfiguration
public class MyApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        new MyApplication()
            .configure(new SpringApplicationBuilder(MyApplication.class))
            .run(args);
    }
}

Существует также класс конфигурации, который импортирует различные другие конфигурации:

@Configuration
@ImportResource(locations = {
    "classpath*:conf/spring/*.xml",
    "classpath*:conf/spring/core/*.xml",
    "classpath*:conf/spring/plugin/**/*.xml"
})
@EnableAsync
@EnableRetry
@EnableCaching
@EnableBatchProcessing
@EnableCircuitBreaker
public class AppConfig {
    ...
}

Кто-нибудь знает, что может вызвать эту проблему и где искать?

Это не произошло до Spring Boot 2.1 (т.е. 2.0.5).

Ответ 1

У меня возникла аналогичная проблема с этим сегодня, и мне помогла следующая конфигурация конфигурации весеннего облака: выпуск 1142.

Мы использовали Spring Cloud Config, который пока не совместим с Spring Boot 2.1.0. Сеанс Greenwich Spring Spring будет совместим с Spring Boot 2.1.0.

Ваша аннотация @EnableCircuitBreaker заставляет меня думать, что вы также можете использовать версию Spring Cloud, которая несовместима с версией Spring @EnableCircuitBreaker версии 2.1.0.

Ответ 2

  • Spring Boot 2.1.x отключает переопределения этого типа компонента.

  • Попробуйте добавить следующую строку к свойствам приложения:

  • spring.main.allow-bean-definition-overriding=true

  • Это повторяет предыдущее поведение.

Ответ 3

Добавление следующего свойства в application.properties решит проблему.

spring.main.allow-боб-определение-наиважнейшая = истина

Кроме того, может потребоваться добавить другое свойство для решения другой упомянутой проблемы: https://github.com/openzipkin/zipkin/issues/2043

management.metrics.web.server.auto-временные запросы = ложь

Ответ 4

Для Spring Boot 2+ вы можете исключить автоконфигурацию

@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
     public class YourApplication {
 ... }

Ответ 5

Я столкнулся с подобной проблемой, и она очень общая (иногда есть дублирующиеся аннотации, иногда дублирующиеся компоненты). Лучший способ найти причину проблемы:

Открытый класс DefaultListableBeanFactory Должен быть такой код:

BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName);
        if (existingDefinition != null) {
            if (!this.isAllowBeanDefinitionOverriding()) {
                throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
            }

Поместите точку останова в соответствие с throw new. Затем существующиеDefinition.source.className указывает на конфигурацию, которая уже зарегистрирована, и здесь возникает проблема. Когда вы проверяете beanDefinition.source.className, вы сравниваете оба класса и обнаруживаете дублированный код или аннотацию, просто удалите/исправьте их.

Ответ 6

org.springframework.cloud:spring-cloud-context:2.0.2.RELEASE

RefreshAutoConfiguration вызывает эту проблему при обновлении HikariDatasource в

возможное исправление

spring.cloud.refresh.enabled = false