首页 > 作文

Feign如何自定义注解翻译器

更新时间:2023-04-06 04:19:06 阅读: 评论:0

feign自定义注解翻译器

新建自定义注解myurl

package org.crazyit.cloud.contract;import java.lang.annotation.elementtype;import java.lang.annotation.retention;import java.lang.annotation.retentionpolicy;import java.lang.annotation.target;//这个注解只能定义方法@target(elementtype.method)@retention(retentionpolicy.runtime)public @interface myurl {  //为注解配置两个属性  string url();  string method();}

新建接口,使用myurl注解

package org.crazyit.cloud.contract;public interface contractclient {  @myurl(url = "/hello", method = "get")  public string hello();}

定义注解翻译器

package org.crazyit.cloud.contract;import java.lang.annotation.annotation;import java.lang.reflect.method;import feign.contract.bacontract;import feign.methodmetadata;public class mycontract extends bacontract {  @override  protected void processannotationonclass(methodmetadata data, class<?> clz) {    // 处理类级别注解  }  @override  protected void processannotationonmethod(methodmetadata data,      annotation annotation, method method) {    // 注解是myurl类型的,才处理    if(myurl.class.isinstance(annotation)) {      myurl myurl = m李清照词集ethod.getannotation(myurl.class);      string url = myurl.url();      string httpmethod = myurl.method();      data.template().met丁当好听的歌hod(httpmethod);      data.template().append(url);    }  }  @override  protected boolean processannotationsonparameter(methodmetadata data,      annotation[] annotations, int paramindex) {    // 处理参数级别注解    return fal;  }}

测试类年轻反义词

package org.crazyit.cloud.contract;import org.crazyit.cloud.jaxrs.rsclient;import feign.feign;import feign.jaxrs.jaxrscontract;public class contractmain {  public static void m未来零售ain(string[] args) {    contractclient client = feign.builder()        .contract(new mycontract())        .target(contractclient.class,        "http://localhost:8080");    string result = client.hello();    system.out.println(result);  }}

启动服务类

测试

hello world

feign注解说明

feign是常用的微服务rpc调用框架,下面对一些注解说明

@target({elementtype.type})@retention(retentionpolicy.runtime)@documented@inheritedpublic @interface feignclient {    /**     * value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。     *     */    @aliasfor("name")    string value() default "";    /**     * rviceid已经废弃了,直接使用name即可。     */    /** @deprecated */    @deprecated    string rviceid() default "";    /**     *某个服务提供的接口不止定义在一个类中,这样启动时会报bean的名称冲突。     * 解决方法:     * 1:参数配置添加     *  spring.main.allow-bean-definition-overriding=true     *     * 2:给每个client指定contextid     *     */    string contextid() default "";    /**     *     *  在注册feign client configuration的时候需要一个名称,名称是通过getclientname方法获取的.     *  查看源码可知,如果配置了contextid就会用contextid,     *  如果没有配置就会去value,然后是name,最后是rviceid。     *  默认都没有配置,当出现一个服务有多个feign client的时候就会报错了。     *     *  其次的作用是在注册feignclient中,contextid会作为client 别名的一部分,如果配置了qualifier优先用qualifier作为别名。     *     */    /**     *见 value     *     */    @aliasfor("value")    string name() default "";    /**     *     * 在注册feignclient中,指定client别名     *     */    string qualifier() default "";    /**     *     * url用于配置指定服务的地址,相当于直接请求这个服务,不经过ribbon的服务选择。像调试等场景可以使用。     *     */    string url() default "";    /**     *     * 当调用请求发生404错误时,decode404的值为true,那么会执行decoder解码,否则抛出异常。     *     */    boolean decode404() default fal;    /**     *     * configuration是配置feign配置类,在配置类中可以自定义feign的encoder、decoder、loglevel、contract等。     * 具体查看feignconfiguration类     *     */    class<?>[] configuration() default {};    /**     *     * 定义容错的处理类,也就是回退逻辑,fallback的类必须实现feign client的接口,无法知道熔断的异常信息。     *     *     *     *     *中国童话 举例:     * //实现调用接口方法     * @component     * public class urremoteclientfallback implements urremoteclient {     *     @override     *     public ur getur(int id) {     *     return new ur(0, "默认fallback");     *     }     * }     *     * //ur服务     * @feignclient(value = "ur", fallback = urremoteclientfallback.class)     * public interface urremoteclient {     *     @getmapping("/ur/get")     *     public ur getur(@requestparam("id")int id);     * }     *     *     */    class<?> fallback() default void.class;    /**     *     * 也是容错的处理,可以知道熔断的异常信息。熔断的另一种处理方法。     *     * //服务类作为参数传入fallbackfactory模板参数     * @component     * public class urremoteclientfallbackfactory implements fallbackfactory<urremoteclient> {     * private logger logger = loggerfactory.getlogger(urremoteclientfallbackfactory.class);     *     * @override     * public urremoteclient create(throwable cau) {     * return new urremoteclient() {     * @override     * public ur getur(int id) {     * logger.error("urremoteclient.getur异常", cau);     * return new ur(0, "默认");     * }     * };     * }     * }     *     */    class<?> fallbackfactory() default void.class;    /**     *     * path定义当前feignclient访问接口时的统一前缀     * 比如接口地址是/ur/get, 如果你定义了前缀是ur, 那么具体方法上的路径就只需要写/get 即可。     *     * @feignclient(name = "ur", path="ur")     * public interface urremoteclient {     *     @getmapping("/get")     *     public ur getur(@requestparam("id") int id);     * }     *     */    string path() default "";    /**     *  primary对应的是@primary注解,默认为true.     *  官方这样设置也是有原因的。当我们的feign实现了fallback后,也就意味着feign client有多个相同的bean在spring容器中,     *  当我们在使用@autowired(建议使用@resource注入对象)进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@primary注解就是干这件事情的。     *     *     */    boolean primary() default true;}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。

本文发布于:2023-04-06 04:19:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/4a9866cb9a30eb5e6e91b39c4ce248a4.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Feign如何自定义注解翻译器.doc

本文 PDF 下载地址:Feign如何自定义注解翻译器.pdf

标签:注解   接口   定义   会报
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图