Миграция netflix в Springboot 1.x на openfeign в Springboot 2.x

Я пытаюсь выполнить миграцию с Springboot 1.x.y (Brussels-SR12) на 2.x.y. Пользуюсь FeignClients

Я меняю конфигурацию Maven:

<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>

так

<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RELEASE</version>

Меняю весь импорт:

import org.springframework.cloud.netflix.feign.EnableFeignClients;

import org.springframework.cloud.netflix.feign.FeignClient;

к

import org.springframework.cloud.openfeign.EnableFeignClients;

import org.springframework.cloud.openfeign.FeignClient;

Я использую этот интерфейс:

@FeignClient(value = "COMPANY", fallbackFactory = CompanyClientFallbackFactory.class, configuration = FeignConfiguration.class)
public interface CompanyClient extends CompanyApi {
}

Когда я запускаю свои тесты JUnit (с контекстом Spring), у меня появляется эта ошибка (не в Springboot 1.x.y и старом пакете netflix):

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

Полная трассировка:

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
    at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:99)
    at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:79)
    at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:54)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
...
Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'COMPANY.FeignClientSpecification' defined in null: Cannot register bean definition [Generic bean: class [org.springframework.cloud.openfeign.FeignClientSpecification]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'COMPANY.FeignClientSpecification': There is already [Generic bean: class [org.springframework.cloud.openfeign.FeignClientSpecification]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:896)
    at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerClientConfiguration(FeignClientsRegistrar.java:355)
    at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClients(FeignClientsRegistrar.java:155)
    at org.springframework.cloud.openfeign.FeignClientsRegistrar.registerBeanDefinitions(FeignClientsRegistrar.java:83)
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
7 756
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я нашел решение, но это обходной путь. См. Ответ @Alessandro Dionisi

application.yml:

spring:
  main:
    allow-bean-definition-overriding: true

Да, это обходной путь, но не решение, спасибо @AlessandroDionisi

Stéphane GRILLON 01.02.2019 11:47

это абсолютно обходной путь, вы должны подумать о том, чтобы переименовать своих фальшивых клиентов или разделить друг друга разными URL-адресами.

talipkorkmaz 30.03.2019 20:40

этот обходной путь приведет вас к более сложным проблемам, потому что он маскирует проблемы с вашими bean-компонентами.

Lu55 27.01.2021 15:17

@ Lu55, см. Ответ Алессандро Диониси

Stéphane GRILLON 27.01.2021 18:43
Ответ принят как подходящий

Возможно, у вас есть несколько определений @FeignClient с одинаковым атрибутом имени.

это решение от Имитация документации:

If we want to create multiple feign clients with the same name or url so that they would point to the same server but each with a different custom configuration then we have to use contextId attribute of the @FeignClient in order to avoid name collision of these configuration beans.

@FeignClient(contextId = "fooClient", name = "stores", configuration = FooConfiguration.class)
public interface FooClient {
    //..
}

@FeignClient(contextId = "barClient", name = "stores", configuration = BarConfiguration.class)
public interface BarClient {
    //..
}

https://github.com/spring-cloud/spring-cloud-openfeign/pull/90/commit/82fa5181fdd2e23e7414521f468ecea88e17d157

Рассмотрите возможность переименования одного из bean-компонентов или включения переопределения, установив spring.main.allow-bean-definition-overriding = true

Вы копируете / вставляете мой ответ, но это не решение, а обходной путь

Stéphane GRILLON 24.04.2019 09:05

Это также может произойти, если у вас случайно есть более одного класса @Configuration, аннотированного с помощью @EnableFeignClients.

Это исправило это для меня. Но я все же хотел бы иметь две отдельные конфигурации в разных модулях.

FazoM 27.01.2020 16:46

Пакет mvn clean исправил эту ошибку для меня

Другие вопросы по теме