一 , 新建自定义注解 MyUrl 了解 springcloud 架构可以加求求: 三五三六二四七二五九
- 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);
- }
- }
来源: http://www.bubuko.com/infodetail-3379461.html