Ошибка внедрения 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;
}
}
Я попытался определить интерфейс клиентского симметричного клиента в разных проектах и разных пакетах и добился успеха только тогда, когда он поместил его в тот же пакет, что и приложение. Это заставляет поверить, что это проблема сканирования компонентов, хотя я включаю пакет в проверку. Я хотел бы сохранить интерфейс симулированного клиента в общем проекте для определения повторно используемого «контракта» и для каждого проекта иметь уникальную структуру пакета вместо определения симулированного клиента с приложением, использующим его.
Спасибо, Уэс.