注入假客户端
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 保存在一个配置包中,而其他代码与该包并行。
我在我的服务中注入 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 保存在一个配置包中,而其他代码与该包并行。