Feign 注解翻译器 三

Posted gyli20170901

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 注解翻译器 三的主要内容,如果未能解决你的问题,请参考以下文章

9-3 Feign演示及Feign注解解析

9-3 Feign演示及Feign注解解析

feign的使用注意

Feign

Feign来调用服务

SpringCloud技术专题「Feign」从源码层面让你认识Feign工作流程和运作机制