Feign-手动创建FeignClient
前言
在Feign-请求不同注册中心的服务中,提到,如果需要请求不同注册中心的服务,可以设置@FeignClient
的url
属性。
这种做法有个缺点,需要服务消费者,配置各个环境的url
。
如果服务提供方url
变更,需要通知到服务消费者,如果消费者很多,变更通知也是件麻烦事。
基于java的封装特性,作为独立的服务提供者,如果能封装url
,岂不是更好?
解决方案
服务提供者
//@FeignClient(name = "feign-provider") public interface CustomizeFeignApi { @RequestMapping(value = "/customize", method = RequestMethod.GET) String queryCustomize(); }
@FeignClient
,不需要。加上的话,会自动创建对应bean,达不到手动创建的目的。
自定义配置
@Configuration @Import(FeignClientsConfiguration.class) public class FeignClientConfig { @Bean public CustomizeFeignApi customizeFeignApi(Contract contract, Decoder decoder, Encoder encoder) { return Feign.builder().contract(contract).encoder(encoder).decoder(decoder).target(CustomizeFeignApi.class, "http://localhost:8004"); } }
@Configuration
:需要被消费者应用扫描到。
@Import(FeignClientsConfiguration.class)
:如果消费者上下文不存在Contract
, Decoder
, Encoder
,由FeignClientsConfiguration
提供默认bean。
以上,可封装为jar
,上传到公司nexus私服,有消费者下载使用。
服务消费者
依赖上文的jar。
<!--服务提供者--> <dependency> <groupId>com.wxs.springcloud</groupId> <artifactId>springcloud-sample-feign-provider-spi</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
注入使用。
@RestController public class CustomizeFeignTestController { @Autowired private CustomizeFeignApi customizeFeignApi; @GetMapping("/customize") public String query() { return customizeFeignApi.queryCustomize(); } }
启动类,添加扫描。 @ComponentScan("com.wxs.feign.provider.api")
验证
遇到的问题
Method not annotated with HTTP method type (ex. GET, POST)
Caused by: java.lang.IllegalStateException: Method queryCustomize not annotated with HTTP method type (ex. GET, POST) at feign.Util.checkState(Util.java:128) ~[feign-core-9.5.0.jar:na] at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:97) ~[feign-core-9.5.0.jar:na] at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.java:64) ~[feign-core-9.5.0.jar:na] at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:146) ~[feign-core-9.5.0.jar:na] at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:53) ~[feign-core-9.5.0.jar:na] at feign.Feign$Builder.target(Feign.java:218) ~[feign-core-9.5.0.jar:na] at feign.Feign$Builder.target(Feign.java:214) ~[feign-core-9.5.0.jar:na] at com.wxs.feign.consumer.config.FeignClientConfig.customizeFeignApi(FeignClientConfig.java:38) ~[classes/:na]
feign.Feign.Builder
默认提供的是:new Contract.Default()
。
需要指定Contract
为SpringMvcContract
。
Feign.builder().contract(new SpringMvcContract()).target(CustomizeFeignApi.class, "http://localhost:8004")
参考
Creating Feign Clients Manually
Feign: Method not annotated with HTTP method type (ex. GET, POST)
原文地址:https://my.oschina.net/wuxinshui/blog/3065696
相关推荐
-
Java 并发编程 ② – 线程生命周期与状态流转 Java基础
2020-6-13
-
Kotlin 中使用okhttp下载图片/文件并获取下载进度(主要是与在Java中的区别)。 Java基础
2019-8-22
-
一张思维导图教你使用google一下 Java基础
2020-5-30
-
深入理解Java虚拟机(自动内存管理机制) Java基础
2019-6-15
-
ArrayList 源码详细分析 Java基础
2019-5-21
-
JNI开发之 静态注册与动态注册(一) Java基础
2020-6-15
-
mybatis学习笔记(13)-延迟加载 Java基础
2020-7-7
-
《JavaScript 模式》读书笔记(5)— 对象创建模式4 Java基础
2020-6-13
-
复联4里用到的方法论 Java基础
2019-8-20
-
IntelliJ Idea 2020.1 正式发布,官方支持中文了 Java基础
2020-6-13