从另一个项目注入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;

}

}

我曾尝试在不同的项目和不同的程序包中定义伪客户端接口,并且只有在将其与应用程序放在同一程序包中时才看到成功。即使我将软件包包括在扫描中,也可以认为这是组件扫描问题。我想将虚拟客户端接口保留在共享项目中,以定义可重用的“合同”,并使每个项目具有唯一的包结构,而不是使用使用它的应用程序定义虚拟客户端。

谢谢,韦斯。

回答:

您需要告诉Feign扫描仪在何处定位接口。

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

"my.local.package"})

以上是 从另一个项目注入FeignClient时出错 的全部内容, 来源链接: utcz.com/qa/426246.html

回到顶部