从另一个项目注入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 contactsByUserId(@PathVariable("userId") String userId); } 

我将组件扫描添加到我的项目中以包含应用程序及其控制器,并将feign客户端包含在另一个项目中。

 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 passportByUserId(@PathVariable String userId) { ResponseEntity ret = null; Collection contacts = contactService.contactsByUserId(userId); if (contacts == null || contacts.isEmpty()) { ret = new ResponseEntity(HttpStatus.NOT_FOUND); } else { ret = ResponseEntity.ok(new Passport(contacts)); } return ret; } } 

我已经尝试在不同的项目和不同的包中定义feign客户端接口,并且只有在将它放在与应用程序相同的包中时才能看到成功。 这使得相信它是一个组件扫描问题,即使我在扫描中包含了包。 我想将feign客户端接口保留在共享项目中,以定义可重用的“契约”,并使每个项目具有唯一的包结构,而不是使用应用程序使用它定义假装客户端。

谢谢,韦斯。

您需要告诉Feign扫描仪在哪里找到接口。

您可以使用@EnableFeignClients(basePackages = {"my.external.feign.client.package", "my.local.package"})

直接类/接口名称可以如下给出

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

此参数接受单个或多个类名