我无法从另一个项目自动连接假装客户端。似乎没有生成和注入假装客户端的实现。
这是我得到的错误。
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;
}
}
我尝试在不同的项目和不同的包中定义feign客户端接口,并且只有在将它放在与应用程序相同的包中时才能看到成功。这使得相信它是一个组件扫描问题,即使我在扫描中包含了包。我想将feign客户端界面保留在共享项目中以定义可重用的&#34;合同&#34;并且每个项目都有一个独特的包结构,而不是使用应用程序使用它来定义假装客户端。
谢谢,Wes。
答案 0 :(得分:39)
您需要告诉Feign扫描仪在哪里找到接口。
您可以使用@EnableFeignClients(basePackages = {"my.external.feign.client.package", "my.local.package"})
。
答案 1 :(得分:0)
直接类/接口名称可以如下所示
@EnableFeignClients(basePackageClasses=com.abc.xxx.client.XXFeignClient.class)
此参数接受单个或多个类名
答案 2 :(得分:0)
我的主类位于“ com.abc.myservicename”包中,而主类名为“ myservicename.java”。我在主类中使用了@SpringBootApplication(scanBasePackages =“ com.abc”)批注。
将主类包名称更改为“ com.abc”已为我解决了该问题。
答案 3 :(得分:0)
感谢您的帮助。我添加了正确的外部包 @EnableFeignClients(basePackages = {}) 它仍然没有选择 feign 客户端实现。
我有一个 PACT 合同测试,我在其中自动装配 api 客户端 bean。我曾经使用过 @ExtendWith(SpringExtension.class) 这就是问题所在。 我换成了@SpringBootTest,这样就可以在这个类中暴露feign client bean了