从另一个项目中注入FeignClient时出错

Wes*_*Wes 22 java component-scan spring-cloud netflix-feign

我无法从另一个项目自动连接假装客户端.似乎没有生成和注入假装客户端的实现.

这是我得到的错误.

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)}
Run Code Online (Sandbox Code Playgroud)

假装客户非常直截了当.为简洁起见,我删除了导入.

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);

}
Run Code Online (Sandbox Code Playgroud)

我将组件扫描添加到我的项目中以包含应用程序及其控制器,并将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);
  }

}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,删除了大部分导入的其余控制器.

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;
  }

}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,韦斯.

spe*_*ibb 56

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

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

  • 我认为我在座椅和键盘之间遇到了问题,因为它现在可以工作了。谢谢。 (3认同)