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);
    }
}

原文地址:https://www.cnblogs.com/gyli20170901/p/10084180.html

时间: 12-06

Feign 注解翻译器 三的相关文章

spring之注解(三)Component

上篇文章中比较详细的介绍了依赖注入的相关注解,尤其是@Autowired.但是我们对bean的定义声明还是放在xml的配置文件中.Spring当然提供了机制可以自动的扫描类路径,自动的向容器注册BeanDefinition.这就是Bean级别的注解.以上机制称为类路径扫描(clsspath-sacn),它是有相关注解(如@Component @Named @Bean)和beanFactoryPostProcessor和BeanPostProcessor实现的.本篇文章我们依次对各个注解进行说明.

Android 自定义注解框架

前言 在我们的项目中,我们几乎天天和一些固定的代码打交道,比如在Activity中你要写findViewById(int)方法来找到控件,然而这样子的代码对于一个稍微有点资格的程序员来说,都是毫无营养的,你根本学不到任何的东西,但是你却必须写.这也就是注解框架的出现,极大的简化了程序员的工作,并且让代码简洁.也许你早就使用过了注解的框架,那么你会自己自己写么?好了,今天就让大家来完成一个注解的框架 阅读的你需要掌握的知识 1.Java反射的知识 2.Java注解的知识 普通的写法 xml布局文件

Spring Cloud官方文档中文版-声明式Rest客户端:Feign

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR2/#spring-cloud-feign 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Declarative REST Client: Feign 声明式Rest客户端:Feign Feign is a declarative web service client. It

Bean装配之@Autowired注解

@Required(不常用) @Autowired(常用) 下面用例子解释以上内容: @Autowired注解的三种方式如下,第一种是直接在属性名上加注解,这样就可以不用在写set方法进行注入,这种方式与set方式作用一样:第二种是在set方法上加注解:第三种是在构造器上加注解 测试代码如下: xml配置文件正常即可: 图解:可以在当前类中,声明ApplicationContext的引用,然后可以用@Autowired进行注解,这时候可以在当前类中得到这个容器,并且可以使用这个容器了 图解: 数

Spring框架第四篇之基于注解的DI注入

一.说明 与@Component注解功能相同,但意义不同的注解还有三个: 1)@Repository:注解在Dao实现类上 2)@Service:注解在Service实现类上 3)@Controller:注解在SpringMVC的处理器上 Bean作用域: @Scope("prototype"):用于指定对象创建模式,可以是单例模式或者原型模式,默认是singleton 基本类型属性注入: @Value @Autowired:byType方式的注解式注入,即根据类型注解 @Qualif

Spring自动装配与扫描注解

1 javabean的自动装配 自动注入,减少xml文件的配置信息. 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!-- 到入xml文件的约束 --> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:p="http://www.springframework.org/sche

Java的注解机制——Spring自动装配的实现原理

使用注解主要是在需要使用Spring框架的时候,特别是使用SpringMVC.因为这时我们会发现它的强大之处:预处理. 注解实际上相当于一种标记,它允许你在运行时(源码.文档.类文件我们就不讨论了)动态地对拥有该标记的成员进行操作. 实现注解需要三个条件(我们讨论的是类似于Spring自动装配的高级应用):注解声明.使用注解的元素.操作使用注解元素的代码. 首先是注解声明,注解也是一种类型,我们要定义的话也需要编写代码,如下: 1 package annotation; 2 3 import j

spring实战之使用注解装配

使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细粒度的自动装配. Spring容器默认禁用注解装配.所以,在使用基于注解的自动装配前,需要在Spring配置中启用它,最简单的启用方式是使用spring的context命名空间配置中的 <context:annotation-config>元素,如下所示: <?xml version=&qu

Java注解介绍

原文链接: Java Annotations: An Introduction原文日期: 2005年10月14日翻译日期: 2014年07月20日翻译人员: 铁锚 翻译完后,感觉这篇文章是不是在http://www.developer.com被挖坟了? Java注解介绍 基于注解(Annotation-based)的Java开发无疑是最新的开发趋势.[译者注: 这是05年的文章,在2014年,毫无疑问,多人合作的开发,使用注解变成很好的合作方式,相互之间的影响和耦合可以很低]. 基于注解的开发将

注解配置springMvc及向作用域中赋值

1.在applicationContext.xml中配置包扫描器 <!-- 使用注解配置扫描器 --> <context:component-scan base-package="cn.cnsdhzzl.controller" /> 2.配置controller /*处理器*/ @Controller /* 命名空间 */ @RequestMapping("/annotation") public class AnnotationContro