Feign如何自定义注解翻译器
作者:chengqiuming 发布时间:2022-11-09 07:05:04
标签:Feign,注解,翻译器
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.BaseContract;
import feign.MethodMetadata;
public class MyContract extends BaseContract {
@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 = method.getAnnotation(MyUrl.class);
String url = myUrl.url();
String httpMethod = myUrl.method();
data.template().method(httpMethod);
data.template().append(url);
}
}
@Override
protected boolean processAnnotationsOnParameter(MethodMetadata data,
Annotation[] annotations, int paramIndex) {
// 处理参数级别注解
return false;
}
}
测试类
package org.crazyit.cloud.contract;
import org.crazyit.cloud.jaxrs.RsClient;
import feign.Feign;
import feign.jaxrs.JAXRSContract;
public class ContractMain {
public static void main(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
@Inherited
public @interface FeignClient {
/**
* value和name的作用一样,如果没有配置url那么配置的值将作为服务名称,用于服务发现。反之只是一个名称。
*
*/
@AliasFor("name")
String value() default "";
/**
* serviceId已经废弃了,直接使用name即可。
*/
/** @deprecated */
@Deprecated
String serviceId() default "";
/**
*某个服务提供的接口不止定义在一个类中,这样启动时会报Bean的名称冲突。
* 解决方法:
* 1:参数配置添加
* spring.main.allow-bean-definition-overriding=true
*
* 2:给每个client指定contextid
*
*/
String contextId() default "";
/**
*
* 在注册Feign Client Configuration的时候需要一个名称,名称是通过getClientName方法获取的.
* 查看源码可知,如果配置了contextId就会用contextId,
* 如果没有配置就会去value,然后是name,最后是serviceId。
* 默认都没有配置,当出现一个服务有多个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 false;
/**
*
* configuration是配置Feign配置类,在配置类中可以自定义Feign的Encoder、Decoder、LogLevel、Contract等。
* 具体查看FeignConfiguration类
*
*/
Class<?>[] configuration() default {};
/**
*
* 定义容错的处理类,也就是回退逻辑,fallback的类必须实现Feign Client的接口,无法知道熔断的异常信息。
*
*
*
*
* 举例:
* //实现调用接口方法
* @Component
* public class UserRemoteClientFallback implements UserRemoteClient {
* @Override
* public User getUser(int id) {
* return new User(0, "默认fallback");
* }
* }
*
* //user服务
* @FeignClient(value = "user", fallback = UserRemoteClientFallback.class)
* public interface UserRemoteClient {
* @GetMapping("/user/get")
* public User getUser(@RequestParam("id")int id);
* }
*
*
*/
Class<?> fallback() default void.class;
/**
*
* 也是容错的处理,可以知道熔断的异常信息。熔断的另一种处理方法。
*
* //服务类作为参数传入FallbackFactory模板参数
* @Component
* public class UserRemoteClientFallbackFactory implements FallbackFactory<UserRemoteClient> {
* private Logger logger = LoggerFactory.getLogger(UserRemoteClientFallbackFactory.class);
*
* @Override
* public UserRemoteClient create(Throwable cause) {
* return new UserRemoteClient() {
* @Override
* public User getUser(int id) {
* logger.error("UserRemoteClient.getUser异常", cause);
* return new User(0, "默认");
* }
* };
* }
* }
*
*/
Class<?> fallbackFactory() default void.class;
/**
*
* path定义当前FeignClient访问接口时的统一前缀
* 比如接口地址是/user/get, 如果你定义了前缀是user, 那么具体方法上的路径就只需要写/get 即可。
*
* @FeignClient(name = "user", path="user")
* public interface UserRemoteClient {
* @GetMapping("/get")
* public User getUser(@RequestParam("id") int id);
* }
*
*/
String path() default "";
/**
* primary对应的是@Primary注解,默认为true.
* 官方这样设置也是有原因的。当我们的Feign实现了fallback后,也就意味着Feign Client有多个相同的Bean在Spring容器中,
* 当我们在使用@Autowired(建议使用@Resource注入对象)进行注入的时候,不知道注入哪个,所以我们需要设置一个优先级高的,@Primary注解就是干这件事情的。
*
*
*/
boolean primary() default true;
}
来源:https://blog.csdn.net/chengqiuming/article/details/81140916


猜你喜欢
- 1.获取屏幕宽高方法1:int screenWidth = getWindowManager().getDefaultDisplay().g
- 简单介绍synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:1. 修饰一个代码块,被修饰的代码块称为同步语句
- Gateway什么是Gateway  由于Netflix的zuul发生问题,spring公司自己研发了一
- 详解C#使用AD(Active Directory)验证内网用户名密码1. 连到内网,找到AD的domain地址nslookup set t
- Android Spinner 组件Spinner: 下拉组件使用事项:布局在XML 中实现,具体的数据在JAVA 代码中实现;所用知识点:
- 本文研究的主要是高吞吐、线程安全的LRU缓存的相关内容,具体介绍如下。几年以前,我实现了一个LRU缓存用来为关键字来查找它的id。数据结构非
- 在分布式系统中,配置文件散落在每个项目中,难于集中管理,抑或修改了配置需要重启才能生效。下面我们使用 Spring Cloud Config
- 最近因为用的发送邮件的地方,就查询了资料,总结以下几个方法1、利用新浪邮箱发送2、利用公司邮箱发送3、利用CDO发送,这种方式要引用Inte
- 使用Castle.Core.dll实现,核心代码是使用Castle.DynamicProxy.ProxyGenerator类的CreateI
- 一、效果实现二、实现思路:1. 正上方的提示区域,用一个类(LockIndicator.java)来实现,自定义view来绘制9个提示图标;
- 什么是环境变量?环境变量通常是指在操作系统当中,用来指定操作系统运行时需要的一些参数。通常为一系列的键值对。path环境变量的作用path环
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- 本文实例为大家分享了Android简单实现文件下载的具体代码,供大家参考,具体内容如下权限<!-- 文件读写权限 &nbs
- 个人详情页滑动到顶部最近产品提了个新需求,需要实现点击App内的某个按钮跳转到个人详情页并且滑动到顶部,个人详情页的页面交互稍微复杂,技术角
- 多段颜色的进度条实现思路,供大家参考,具体内容如下这个进度条其实相对简单. 这里可以把需要绘制的简单分为两个部分1.灰色背景部分 2.多段颜
- 本文实例为大家分享了Android实现屏幕录制功能的具体代码,供大家参考,具体内容如下1.效果图:2.添加依赖 dependenc
- 代理模式代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远
- 本文实例讲述了APK程序获取system权限的方法。分享给大家供大家参考。具体如下:最近项目需要,用NDK编程,遇到了些问题,在访问底层的设
- 插件安装方式:新版本IDE安装方式略有不同,不一一赘述 1、Background Image Plus
- 前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home