• 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);
        }
    }
  • 相关阅读:
    POJ-2112 Optimal Milking(floyd+最大流+二分)
    网络流之最大流与最小费用流入门&&模板
    0316 校赛训练赛3 解题报告
    string的子串截取
    hash题目大汇总
    Codeforces Round #235 (Div. 2)
    poj2002 -- 点的hash
    hlgHCPC2014校赛训练赛 1 BB.序列问题
    树状数组模板,RMQ模板
    从未放弃--2014.1.21
  • 原文地址:https://www.cnblogs.com/gyli20170901/p/10084180.html
Copyright © 2020-2023  润新知