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)
Feign-手动创建FeignClient的更多相关文章
- SpringCloud系列十二:手动创建Feign
1. 回顾 上文讲解了自定义Feign.但是在某些场景下,前文自定义Feign的方式满足不了需求,此时可使用Feign Builder API手动创建Feign. 本文围绕以下场景,为大家讲解如何手动 ...
- 通过手动创建统计信息优化sql查询性能案例
本质原因在于:SQL Server 统计信息只包含复合索引的第一个列的信息,而不包含复合索引数据组合的信息 来源于工作中的一个实际问题, 这里是组合列数据不均匀导致查询无法预估数据行数,从而导致无法选 ...
- 手动创建VS单元测试,显示代码覆盖率
Visual Studio 号称有史以来最强大的IDE,确实如此.创建单元测试也是一键完成:在方法的代码块中右键“Create Unit Test…”,勾选测试项,填项目名,完成.VS就会自动帮你创建 ...
- java web(一) 使用sql标签库+tomcat+mysql手动创建一个jsp练习总结
2016-09-0111:06:53 使用sql标签库+tomcat+mysql手动创建一个jsp 1. 1.1安装tomcat ...
- Maven 系列 二 :Maven 常用命令,手动创建第一个 Maven 项目【转】
1.根据 Maven 的约定,我们在D盘根目录手动创建如下目录及文件结构: 2.打开 pom.xml 文件,添加如下内容: <project xmlns="http://maven.a ...
- 用Sqlplus手动创建Oracle11g数据库
用Sqlplus手动创建Oracle数据库 刚开始学习Oracle数据库,菜鸟一个,使用sqlplus创建数据库遇到了很多问题,通过不断地百度,终于创建成功了.所以顺便把整个过程中犯的一些最低级的错误 ...
- servlet和手动创建servlet,断点调试
1. 什么是Servlet Servlet是一种用Java语言编写的Web应用组件 Servlet主要用于动态网页输出,扩展了Web服务器的功能 Servlet由Servlet容器进行管理 2. ...
- Maven手动创建多模块项目
Maven手动创建多模块项目 我要创建的项目名称是:unicorn,项目包含两个模块,分别是unicorn-core和unicorn-web.包的路径是com.goldpalm.tour. 项目创建流 ...
- 手动创建第一个OC程序
手动创建第一个OC程序 创建一个文件夹,文件夹内创建一个a.m的OC源文件,并编辑 之前说过,OC是完全兼容C语言的,那么我们先写个下面的程序尝试一下 #include<stdio.h> ...
随机推荐
- 洛谷P1013 进制位
P1013 进制位 题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E ...
- Java无模板导出Excel,Apache-POI插件实现
开发环境 jdk 1.8 Maven 3.6 Tomcat 8.5 SpringBoot 2.1.4.RELEASE Apache-POI 3.6 Idea 注意: 我是在现有的基于SpringBoo ...
- Luogu P4403 [BJWC2008]秦腾与教学评估【二分答案】By cellur925
题目传送门 这道题:真·凉心出题人. 二分答案,个人感觉其实并不只适用于有明显的"最大值最小/最小值最大"条件的题目,其实也可以称它为一种"优化的暴力".这题就 ...
- 利用system.reflection遍历一个类的变量成员
假设有下面一个类,在程序中已初始化,如何获取里面的变量成员name,age,onduty及其值呢? public class Employee { public string name; public ...
- 洛谷P2136 拉近距离
题目背景 我是源点,你是终点.我们之间有负权环. --小明 题目描述 在小明和小红的生活中,有\(N\)个关键的节点.有\(M\)个事件,记为一个三元组\((S_i,T_i,W_i)\),表示从节点\ ...
- Leetcode:单调数列
题目 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j,A[i]> ...
- SQL 索引查找
索引查找信息 在非聚集索引里,会为每条记录存储一份非聚集索引索引键的值和一份聚集索引索引键 [在没有聚集索引的表格里,是RID值指向数据页面,有聚集索引的话指向聚集索引的键(在不使用include时) ...
- Quartz.NET基础入门
Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了作业和 ...
- 阿里云服务器Centos7安装FastDFS(一)
安装步骤一 安装FastDFS需要安装:gcc.libevent.libfastcommon.FastDFS(包括tracker和storage) 安装gcc 判断是否安装了gcc gcc -V 如果 ...
- pixhawk在linux(ubuntu16.04)下的开发环境搭建和源码编译
1查找安装文档(http://dev.px4.io/starting-installing-linux.html)(本文仅针对硬件为PIXHAWK的开发环境搭建,其他硬件请参考官方文档) ...