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 ...
随机推荐
- signal之——异步回收机制2
前言:上一篇的处理方法可以解决所有回收问题,但是如果我们不考虑子进程的返回状态,那么可以使内核来进行对子进程的回收 代码如下: //如果无需关心进程结束状态 可以设置子进程结束时不产生僵尸进程有内核值 ...
- [LC] 76. Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- 79)PHP,session函数编写的注意事项
(1)先执行 session_set_save_handler() 在session_start(). (2)那么开启session_start(),有两种方法,一个就是session_start ...
- EmguCV常用函数总结
Emgucv常用函数总结: 读取图片 Mat SCr = new Mat(Form1.Path, Emgu.CV.CvEnum.LoadImageType.AnyColor); //根据路径创建指定的 ...
- Python opencv PIL numpy base64互相转化
PIL2numpy and numpy2PIL from PIL import Image import numpy image = Image.open('timg.jpeg')# image is ...
- 深入JVM内核--GC算法和种类
GC的概念 Garbage Collection 垃圾收集 1960年 List 使用了GC Java中,GC的对象是堆空间和永久区 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 使用者 CO ...
- [LC] 225. Implement Stack using Queues
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- Listary快速查找文件
快速查找文件 https://www.listary.com/
- java中Redis5大基本类型的用法
存储格式 基本用法 通过Jedis(封装了redis的Java客户端)对redis进行操作. Jedis工具类 public class JedisPoolUtil { private static ...
- js页面--年份自动增加
) { document.write("-" + new Date().getFullYear()); }</script> // 大于2017年自动加上 - 年份