Ошибка внедрения FeignClient из другого проекта

У меня возникли проблемы с автоматическим подключением фиктивного клиента из другого проекта. Похоже, что реализация ложного клиента не создается и не внедряется.

Это ошибка, которую я получаю.

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'passportRestController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: private com.wstrater.service.contacts.client.ContactService com.wstrater.service.passport.server.controllers.PassportRestController.contactService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [com.wstrater.service.contacts.client.ContactService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true)}

Притворный клиент довольно прямолинеен. Я удалил импорт для краткости.

package com.wstrater.service.contacts.client;

@FeignClient("contact-service")
public interface ContactService {

  @RequestMapping(method = RequestMethod.GET, value = ContactConstants.CONTACTS_USER_ID_PATH)
  public Collection<Contact> contactsByUserId(@PathVariable("userId") String userId);

}

Я добавил сканирование компонентов в свой проект, чтобы включить приложение и его контроллеры, а также включить фиктивный клиент в другой проект.

package com.wstrater.service.passport.server;

@EnableEurekaClient
@EnableFeignClients
@SpringCloudApplication
@ComponentScan({"com.wstrater.service.passport.server",
                "com.wstrater.service.contacts.client"})
public class PassportServiceApplication {

  public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(PassportServiceApplication.class, args);
  }

}

Остальной контроллер с большей частью импорта удален для краткости.

package com.wstrater.service.passport.server.controllers;

import com.wstrater.service.contacts.client.ContactService;

@RestController
public class PassportRestController {

  @Autowired
  private ContactService contactService;

  @RequestMapping(PassportContstants.PASSPORT_USER_ID_PATH)
  public ResponseEntity<Passport> passportByUserId(@PathVariable String userId) {
    ResponseEntity<Passport> ret = null;

    Collection<Contact> contacts = contactService.contactsByUserId(userId);
    if (contacts == null || contacts.isEmpty()) {
      ret = new ResponseEntity(HttpStatus.NOT_FOUND);
    } else {
      ret = ResponseEntity.ok(new Passport(contacts));
    }

    return ret;
  }

}

Я пытался определить фиктивный клиентский интерфейс в разных проектах и ​​разных пакетах и ​​добился успеха только тогда, когда он поместил его в тот же пакет, что и приложение. Это заставляет думать, что это проблема сканирования компонента, хотя я включаю пакет в сканирование. Я хотел бы сохранить фиктивный клиентский интерфейс в общем проекте, чтобы определить многоразовый «контракт» и чтобы каждый проект имел уникальную структуру пакета вместо определения фиктивного клиента с помощью приложения, использующего его.

Спасибо, Уэс.


person Wes    schedule 14.05.2015    source источник


Ответы (4)


Вам нужно сообщить сканеру Feign, где найти интерфейсы.

Вы можете использовать @EnableFeignClients(basePackages = {"my.external.feign.client.package", "my.local.package"}).

person spencergibb    schedule 14.05.2015
comment
Спасибо. Я быстро попробовал, так как что-то еще только что появилось, но я не вижу разницы. Я переместил список пакетов из ComponentScan в EnableFeignClients. @EnableFeignClients(basePackages = {"com.wstrater.service.passport.server", "com.wstrater.service.contacts.client"}). Он все еще получает ошибку. - person Wes; 15.05.2015
comment
Я думаю, что у меня были проблемы где-то между сиденьем и клавиатурой, потому что теперь это работает. Спасибо. - person Wes; 18.05.2015
comment
Спасибо @Wes, это помогло мне. - person Jeroen Rondeel; 25.11.2016
comment
Это мне очень помогло. Благодарю вас! - person kholofelo Maloma; 27.03.2017
comment
В моем тестовом классе IntelliJ сообщает мне об ошибке, но если я запущу тест, он будет работать нормально. Я должен аннотировать тестовый класс с помощью @SuppressWarnings("SpringJavaAutowiringInspection"), и он подавит эти предупреждения об ошибках. - person alltej; 23.06.2017

Прямое имя класса/интерфейса можно указать, как показано ниже.

@EnableFeignClients(basePackageClasses=com.abc.xxx.client.XXFeignClient.class)

Этот параметр принимает одно или несколько имен классов.

person Swarit Agarwal    schedule 27.11.2017

Мой основной класс находился в пакете «com.abc.myservicename», а имя моего основного класса было «myservicename.java». Я использовал аннотацию @SpringBootApplication(scanBasePackages="com.abc") в своем основном классе.

Изменение имени пакета основного класса на «com.abc» решило проблему для меня.

person user12152065    schedule 02.10.2019

Спасибо за помощь. Я добавил правильный внешний пакет в @EnableFeignClients(basePackages = {}). Он все еще не подхватил реализацию фиктивного клиента.

У меня был тест контракта PACT, в котором я автоматически подключал клиентский компонент API. Я использовал @ExtendWith(SpringExtension.class), что и было проблемой. Я заменил на @SpringBootTest, что позволило выставить фиктивный клиентский компонент в этом классе.

person divs    schedule 05.08.2021