Feign 注解翻译器 三
一、自定义注解翻译器
(1)JAXRS 注解翻译器实例
① 导入JAXRS所需要的jar包
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>9.5.0</version>
</dependency> <dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>9.5.0</version>
</dependency> <!--配置xml客户端-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxb</artifactId>
<version>9.5.0</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency> <dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency> <!--httpclient-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<!--Feign 对 JAXRS 的支持-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-jaxrs</artifactId>
<version>9.5.0</version>
</dependency> <!--JAXRS-->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
② 编写接口类 并使用 javax注解
import javax.ws.rs.GET;
import javax.ws.rs.Path; public interface RsClient { @GET
@Path(value = "/hello")
public String hello();
}
③ 测试方法
public static void main(String[] args) {
//使用 JAXRS 注解翻译器
RsClient rsClient = Feign.builder()
.contract(new JAXRSContract())
.target(RsClient.class, "http://localhost:8080");
String result = rsClient.hello();
System.out.println("result:"+result);
//使用自定义的注解翻译器
ContractClient client = Feign.builder().contract(new MyContract())
.target(ContractClient.class, "http://localhost:8080");
String result1 = client.hello();
System.out.println("result1:" + result1);
//设置请求拦截器
ClientInterface helloClient = Feign.builder()
.requestInterceptor(new MyInterceptor())
.target(ClientInterface.class, "http://localhost:8080");
String hello = helloClient.hello();
System.out.println(hello);
}
(2)自定义注解翻译器MyContract
① 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyUrl { String url(); String method();
}
② 编写接口类 ContractClient 并使用自定义注解 @MyUrl
public interface ContractClient {
@MyUrl(url = "/hello", method = "GET")
public String hello();
}
③ 自定义注解翻译器
import feign.Contract;
import feign.MethodMetadata; import java.lang.annotation.Annotation;
import java.lang.reflect.Method; public class MyContract extends Contract.BaseContract {
@Override
protected void processAnnotationOnClass(MethodMetadata methodMetadata, Class<?> aClass) { } @Override
protected void processAnnotationOnMethod(MethodMetadata methodMetadata, Annotation annotation, Method method) {
//注解是MyUrl类型的,才处理
if (MyUrl.class.isInstance(annotation)) {
MyUrl myUrl = method.getAnnotation(MyUrl.class);
String url = myUrl.url();
String httpMethod = myUrl.method();
methodMetadata.template().method(httpMethod);
//将接口地址追加到 url后面
methodMetadata.template().append(url); }
} @Override
protected boolean processAnnotationsOnParameter(MethodMetadata methodMetadata, Annotation[] annotations, int i) {
return false;
}
}
二、编写并设置请求拦截器(此处测试demo 上述main方法 使用的接口demo是 上一篇博客 Feign 二中的 ClientInterface)
(1)自定义请求拦截器
import feign.RequestInterceptor;
import feign.RequestTemplate; public class MyInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
//此处可以设置请求的数据类, 这样就不用再每个方法是上设置了
//@Headers("Content-Type: application/xml")
requestTemplate.header("Content-Type", "application/json");
System.out.println("这是请求拦截器");
}
}
三、设置接口请求日志
import com.idelan.cloud.interfaces.ClientInterface;
import feign.Feign;
import feign.Logger; public class HelloMain {
public static void main(String[] args) {
/**
* 日志级别描述
* NONE, 默认值,不记录日志
* BASIC, 记录请求方法,URL, 响应代码和执行时间
* Headers, 除了BASIC 记录的日志外,还会记录请求头和响应头的信息
* FULL,在HEADERS的基础上,请求响应的元数据,都会保存
*/
ClientInterface helloClient = Feign.builder()
.logLevel(Logger.Level.FULL)
.logger(new Logger.JavaLogger().appendToFile("E:/logs/http.log"))
.target(ClientInterface.class, "http://localhost:8080"); String hello = helloClient.hello();
System.out.println(hello);
}
}
Feign 注解翻译器 三的更多相关文章
- Spring Cloud 入门 之 Feign 篇(三)
原文地址:Spring Cloud 入门 之 Feign 篇(三) 博客地址:http://www.extlight.com 一.前言 在上一篇文章<Spring Cloud 入门 之 Ribb ...
- Spring Cloud 入门Eureka -Consumer服务消费(声明式Feign)(三)
Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口并用注解来配置它既可完成对Web服务接 ...
- spring注解之@Import注解的三种使用方式
目录 1.@Import注解须知 2.@Import的三种用法 3.@Import注解的三种使用方式总结 @ 1.@Import注解须知 1.@Import只能用在类上 ,@Import通过快速导入的 ...
- SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller.使用这个 Controller ,可以实现三个 ...
- Java 系列之spring学习--注解(三)
一.注解 使用注解之前要开启自动扫描功能 <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- SpringMVC常用注解(三)
一.@Controller .@RestController 和 @ControllerAdvice 1. @Controller @Controller 用于标记在一个类上,使用它标记的类就是一个S ...
- 注解深入浅出之Retrofit中的注解(三)
更多andorid高级架构进阶视频免费分享学习请点击:https://space.bilibili.com/474380680 Retrofit中的注解 @Query,@QueryMap,@Field ...
- hibernate注解(三)1+N问题
一.什么时候会遇到1+N的问题? 前提:Hibernate默认表与表的关联方法是fetch="select",不是fetch="join",这都是为了懒加载而准 ...
- Java注解(三)
上一篇了解了自定义注解的使用,不过里面的例子没有多大使用价值,这一回来个有用点的Demo. 目标:将实体bean保存到数据库 先来定义一个实体注解 import java.lang.annotatio ...
随机推荐
- Descriptive Measures for Populations|Parameter|Statistic|standardized variable|z-score
3.4 Descriptive Measures for Populations; Use of Samples For a particular variable on a particular p ...
- StartDT AI Lab | 视觉智能引擎——从Face ID说起,浅析顾客数字化
“顾客就是上帝”,这句西谚揭示了顾客占据着商业活动中心地位这一客观规律.为了能更好地服务顾客,优化商家自身的服务与产品,对顾客的分析与需求调研一直是商业经营分析中的重中之重. 在商业互联网化.社会数字 ...
- bug_ warning: control reaches end of non-void function
摘要 在leetcode上编译时,它显示我编译错误 warning: control reaches end of non-void function 它的意思是:控制到达非void函数的结尾.就是说 ...
- [LC] 226. Invert Binary Tree
Invert a binary tree. Example: Input: 4 / \ 2 7 / \ / \ 1 3 6 9 Output: 4 / \ 7 2 / \ / \ 9 6 3 1 /* ...
- awk使用和详解
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- Sublime Text 2+Zen Coding
自己长期使用editplus做代码编辑,使用过DW,还是习惯前者的使用环境.好友推荐,试试新的编码工具——Sublime Text 2.在代码制作过程中,最主要的是1)快速复制的模式化工作 2)零碎 ...
- SQL update 关联更改,内部需要引用表名
select A.Id,A.Email,( select C.Email from [nopCommerce].[dbo].[Customer] C left join [nopCommerce].[ ...
- win7电脑磁盘文件以分组方式展现解决方案
问题: win7电脑磁盘文件以分组方式展现,具体如下: 解决: 右键磁盘空白处-->分组依据-->选择无:图解如下:
- cesium入门示例-矢量化单体分类
实现楼层的分层选择和属性信息展示,该功能基于大雁塔倾斜数据实现单体化分类显示. 数据准备: 1.大雁塔倾斜数据,已转换为3dTiles,参考cesium入门示例-3dTiles加载的第2节osgb数据 ...
- Java找出两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共结点. 我的思路:因为是链表,长度都是未知的,不能盲目的两个一起开始自增判断. 首先需要得到 L1的长度 和 L2的长度,让较长的那个先走 (length1- ...