一 新建自定義註解MyUrl
需要JAVA Spring Cloud大型企業分佈式微服務雲構建的B2B2C電子商務平臺源碼請加企鵝求求 :二一四七七七五六三三
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);
}
}