注入假客户端

Injecting feign client

我在我的服务中注入 feignClient 接口时出错。这是我使用的 spring 引导和 spring 云版本:

org.springframework.boot:spring-boot-starter-parent:2.0.6.RELEASE spring cloud version : Finchley.SR2

但是当我在我的 class 服务中创建一个 feignclient bean 时它起作用了。

创建客户伪装客户:

@Component("DepartmentClient")
@FeignClient(name = "DEPARTMENT-SERVICE", url = "http://test")
public interface DepartmentClient {

    @RequestMapping(value = "/department/{departmentId}", method = RequestMethod.GET)
    void findDepartmetById(@PathVariable("departmentId") int departmentId);

}

我在服务中注入了这个假客户端,就像

@Service
public class AgentService {

    Logger logger = LoggerFactory.getLogger(AgentService.class);

    @Autowired
    private AgentRepository agentRepository;

    @Autowired
    private DepartmentClient departmentClient;
....
}

输出

Field departmentClient in ...AgentService required a bean of type '...DepartmentClient' that could not be found.
The injection point has the following annotations:
org.springframework.beans.factory.annotation.Autowired(required=true)
Action:

Consider defining a bean of type .... DepartmentClient' in your configuration.

你试过去掉feign接口的@Component吗?

否则看看你spring应用程序component-scan,如果你的接口不是扫描bean将不会被创建

要使 Feign Client 正常工作,您必须将 @EnableFeignClients 添加到 Configuration class@SpringBootApplication class

@SpringBootApplication
@EnableFeignClients
public class FooMain {  // Your Main class
    public static void main(String[] args) {
        SpringApplication.run(FooMain.class, args);
    }
}

在上面的回答中添加更多细节:

在@FeignClient注解中,String值(上面的"department")是一个任意的客户端名称,用于创建Ribbon负载均衡器。您还可以使用 url 属性(绝对值或主机名)指定 URL。应用程序上下文中的 bean 名称是接口的完全限定名称。要指定您自己的别名值,您可以使用 @FeignClient 注释的限定符值。

为了使 Feign 客户端正常工作,以下是我们需要执行的步骤:

1. Feign Client 的变化:应该是带有Feign client注解的接口

@FeignClient(
  name = "DEPARTMENT-SERVICE",
  configuration = {DepartmentConfiguration.class},
  fallback = DepartmentFallback.class
)
@RequestMapping(
  value = {"${service.apipath.department}"},
  consumes = {"application/json"},
  produces = {"application/json"}
)
public interface DepartmentClient {

  @RequestMapping(value = "/department/{departmentId}", method = 
    RequestMethod.GET)
  void findDepartmetById(@PathVariable("departmentId") int departmentId);

}

2。主要变化 class :

@EnableFeignClients
@SpringBootApplication
public class DepartmentApplication {
  public static void main(String[] args) {
    SpringApplication.run(DepartmentApplication.class, args);
  }
}

我有一个类似的例外, 但是我的 @SpringBootApplication class 中已经有 @EnableFeignClients。尽管如此,spring 仍无法从 FeignClient 接口创建 clientBean。

原来我必须为注释提供 basePackages 值。 如果没有它,Spring 不会从 @FeignClient 接口创建 LoadBalanced HTTP 客户端 class。

@EnableFeignClients(basePackages = "com.xxx.xxx")

可能是因为我总是将我的 ApplicationClass 保存在一个配置包中,而其他代码与该包并行。