最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Feign如何自定義注解翻譯器

 更新時間:2022年03月16日 16:29:59   作者:chengqiuming  
這篇文章主要介紹了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) {
? ? ? ? // 處理參數(shù)級別注解
? ? ? ? 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);
? ? }
?
}

啟動服務(wù)類

測試

Hello World

Feign注解說明

Feign是常用的微服務(wù)rpc調(diào)用框架,下面對一些注解說明

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface FeignClient {
    /**
     * value和name的作用一樣,如果沒有配置url那么配置的值將作為服務(wù)名稱,用于服務(wù)發(fā)現(xiàn)。反之只是一個名稱。
     *
     */
    @AliasFor("name")
    String value() default "";
    /**
     * serviceId已經(jīng)廢棄了,直接使用name即可。
     */
    /** @deprecated */
    @Deprecated
    String serviceId() default "";
    /**
     *某個服務(wù)提供的接口不止定義在一個類中,這樣啟動時會報Bean的名稱沖突。
     * 解決方法:
     * 1:參數(shù)配置添加
     *  spring.main.allow-bean-definition-overriding=true
     *
     * 2:給每個client指定contextid
     *
     */
    String contextId() default "";
    /**
     *
     *  在注冊Feign Client Configuration的時候需要一個名稱,名稱是通過getClientName方法獲取的.
     *  查看源碼可知,如果配置了contextId就會用contextId,
     *  如果沒有配置就會去value,然后是name,最后是serviceId。
     *  默認(rèn)都沒有配置,當(dāng)出現(xiàn)一個服務(wù)有多個Feign Client的時候就會報錯了。
     *
     *  其次的作用是在注冊FeignClient中,contextId會作為Client 別名的一部分,如果配置了qualifier優(yōu)先用qualifier作為別名。
     *
     */
    /**
     *見 value
     *
     */
    @AliasFor("value")
    String name() default "";
    /**
     *
     * 在注冊FeignClient中,指定client別名
     *
     */
    String qualifier() default "";
    /**
     *
     * url用于配置指定服務(wù)的地址,相當(dāng)于直接請求這個服務(wù),不經(jīng)過Ribbon的服務(wù)選擇。像調(diào)試等場景可以使用。
     *
     */
    String url() default "";
    /**
     *
     * 當(dāng)調(diào)用請求發(fā)生404錯誤時,decode404的值為true,那么會執(zhí)行decoder解碼,否則拋出異常。
     *
     */
    boolean decode404() default false;
    /**
     *
     * configuration是配置Feign配置類,在配置類中可以自定義Feign的Encoder、Decoder、LogLevel、Contract等。
     * 具體查看FeignConfiguration類
     *
     */
    Class<?>[] configuration() default {};
    /**
     *
     * 定義容錯的處理類,也就是回退邏輯,fallback的類必須實現(xiàn)Feign Client的接口,無法知道熔斷的異常信息。
     *
     *
     *
     *
     * 舉例:
     * //實現(xiàn)調(diào)用接口方法
     * @Component
     * public class UserRemoteClientFallback implements UserRemoteClient {
     * 	    @Override
     * 	    public User getUser(int id) {
     * 		    return new User(0, "默認(rèn)fallback");
     * 	    }
     * }
     *
     * //user服務(wù)
     * @FeignClient(value = "user", fallback = UserRemoteClientFallback.class)
     * public interface UserRemoteClient {
     * 	    @GetMapping("/user/get")
     * 	    public User getUser(@RequestParam("id")int id);
     * }
     *
     *
     */
    Class<?> fallback() default void.class;
    /**
     *
     * 也是容錯的處理,可以知道熔斷的異常信息。熔斷的另一種處理方法。
     *
     * //服務(wù)類作為參數(shù)傳入FallbackFactory模板參數(shù)
     * @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, "默認(rèn)");
     * 			}
     * 		};
     * 	}
     * }
     *
     */
    Class<?> fallbackFactory() default void.class;
    /**
     *
     * path定義當(dāng)前FeignClient訪問接口時的統(tǒng)一前綴
     * 比如接口地址是/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對應(yīng)的是@Primary注解,默認(rèn)為true.
     *  官方這樣設(shè)置也是有原因的。當(dāng)我們的Feign實現(xiàn)了fallback后,也就意味著Feign Client有多個相同的Bean在Spring容器中,
     *  當(dāng)我們在使用@Autowired(建議使用@Resource注入對象)進行注入的時候,不知道注入哪個,所以我們需要設(shè)置一個優(yōu)先級高的,@Primary注解就是干這件事情的。
     *
     *
     */
    boolean primary() default true;
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java實現(xiàn)的根據(jù)概率隨機中獎測試類

    java實現(xiàn)的根據(jù)概率隨機中獎測試類

    這篇文章主要介紹了java實現(xiàn)的根據(jù)概率隨機中獎測試類,結(jié)合完整實例形式詳細(xì)分析了java隨機數(shù)實現(xiàn)概率運算相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • Java黑科技:replace首個替換一秒搞定

    Java黑科技:replace首個替換一秒搞定

    要實現(xiàn)只替換第一個匹配項,可以使用Java中的String類的replaceFirst方法,該方法接受兩個參數(shù),第一個參數(shù)是要替換的字符串或正則表達式,第二個參數(shù)是替換后的字符串,需要的朋友可以參考下
    2023-10-10
  • 在java代碼中獲取JVM參數(shù)的方法

    在java代碼中獲取JVM參數(shù)的方法

    下面小編就為大家?guī)硪黄趈ava代碼中獲取JVM參數(shù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • java string類方法深入解析

    java string類方法深入解析

    以下是對java中的string類方法進行了詳細(xì)的分析介紹。需要的朋友可以過來參考下
    2013-08-08
  • Java關(guān)鍵字之this用法詳解

    Java關(guān)鍵字之this用法詳解

    這篇文章將為大家詳細(xì)介紹一下Java關(guān)鍵字this的用法,文中有相關(guān)的代碼示例,希望對大家的學(xué)習(xí)或工作有一定的幫助,感興趣的同學(xué)可以參考下
    2023-05-05
  • SpringBoot2.X Kotlin系列之?dāng)?shù)據(jù)校驗和異常處理詳解

    SpringBoot2.X Kotlin系列之?dāng)?shù)據(jù)校驗和異常處理詳解

    這篇文章主要介紹了SpringBoot 2.X Kotlin系列之?dāng)?shù)據(jù)校驗和異常處理詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作

    Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作

    這篇文章主要介紹了Java 判斷線程池所有任務(wù)是否執(zhí)行完畢的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    Spring Boot快速實現(xiàn) IP地址解析的示例詳解

    這篇文章主要介紹了Spring Boot快速實現(xiàn)IP地址解析,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • Mybatis 將table表名作為參數(shù)傳入操作

    Mybatis 將table表名作為參數(shù)傳入操作

    這篇文章主要介紹了Mybatis 將table表名作為參數(shù)傳入操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • JAVA記住密碼功能的實現(xiàn)代碼

    JAVA記住密碼功能的實現(xiàn)代碼

    這篇文章主要介紹了JAVA記住密碼功能的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01

最新評論

陆良县| 会昌县| 桐城市| 商水县| 浑源县| 六安市| 邹城市| 九龙城区| 万年县| 黄陵县| 宾川县| 咸阳市| 柞水县| 曲麻莱县| 蓬莱市| 西藏| 安陆市| 含山县| 子长县| 新化县| 高陵县| 绥化市| 忻州市| 芮城县| 涟源市| 万山特区| 托里县| 临澧县| 中阳县| 江川县| 营口市| 新兴县| 固安县| 罗甸县| 鄂温| 道真| 讷河市| 繁昌县| 来凤县| 晋中市| 屯留县|