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

解決SpringCloud Gateway采用OpenFeign遠程調(diào)用失敗的問題

 更新時間:2024年09月29日 14:43:09   作者:Ramboooooooo  
在使用SpringCloud網(wǎng)關(guān)進行統(tǒng)一鑒權(quán)和認(rèn)證過程中,通過OpenFeign遠程調(diào)用鑒權(quán)服務(wù)器接口時可能會遇到遠程調(diào)用失敗的問題,這通常是因為HttpMessageConverters沒有被正確注入到Spring容器中

一、框架版本

Spring Boot、 Spring Cloud 、 Spring Cloud Alibaba

框架名稱框架版本
Spring Boot2.2.5.RELEASE
Spring CloudHoxton.SR3
Spring Cloud Alibaba2.2.1.RELEASE

二、源碼展示

遠程鑒權(quán) Controller 控制器代碼片段

@RestController
@Slf4j
@RequestMapping("/security")
public class AuthenticationController {

    @Resource
    private AuthenticationService authenticationService;

    @PostMapping("/auth")
    public Boolean checkAuth(@RequestBody @Valid BaseRequest baseRequest) {
        log.info("<-------------------------->");
        return authenticationService.checkAuth(baseRequest);
    }
}

網(wǎng)關(guān)引用 OpenFeign 依賴

<!-- OpenFeign -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>

網(wǎng)關(guān) OpenFeign 調(diào)用客戶端

@Component
@FeignClient(value = "rms-security-service")
public interface InvokeSecurityServiceClient {

    @PostMapping("/security/auth")
    Boolean checkAuth(BaseRequest baseRequest);
}

三、問題描述

在網(wǎng)關(guān)層進行統(tǒng)一鑒權(quán)和認(rèn)證的過程中,需要遠程調(diào)用鑒權(quán)服務(wù)器的接口進行鑒權(quán)的操作。

但是在采用 OpenFiegn 進行遠程調(diào)用的過程中,出現(xiàn)了如下的報錯堆棧,導(dǎo)致了遠程調(diào)用失敗

  • 堆棧信息

feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:384)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
    |_ checkpoint ? org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? cn.com.jstec.open.cloud.gateway.config.SecurityConfig$$Lambda$772/0x0000016c006c3040 [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
    |_ checkpoint ? org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
    |_ checkpoint ? HTTP GET "/open-platform/achievement/list?page=1" [ExceptionHandlingWebHandler]
Stack trace:

  • 關(guān)鍵信息

No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters

四、解決方案

堆棧分析

  • HttpMessageConverters 沒有被注入到容器中管理
  • ISSUES 跟蹤
  • 點擊此處 查看 issues 信息

解決方案

源碼:HttpMessageConverters.java 中沒有發(fā)現(xiàn)異常,于是開始查看是否存在 AutoConfiguration 打開 HttpMessageConvertersAutoConfiguration.java

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HttpMessageConverter.class)
@Conditional(NotReactiveWebApplicationCondition.class)
@AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class, JsonbAutoConfiguration.class })
@Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class,
		JsonbHttpMessageConvertersConfiguration.class })
public class HttpMessageConvertersAutoConfiguration {
}

源碼:@Conditional(NotReactiveWebApplicationCondition.class) @ConditionalSpring4 新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件給容器注冊 bean 再查看類 NotReactiveWebApplicationCondition

static class NotReactiveWebApplicationCondition extends NoneNestedConditions {

		NotReactiveWebApplicationCondition() {
			super(ConfigurationPhase.PARSE_CONFIGURATION);
		}

		@ConditionalOnWebApplication(type = Type.REACTIVE)
		private static class ReactiveWebApplication {

		}

	}

Spring Cloud Gateway 是基于 WebFlux 的,是 ReactiveWeb,所以 HttpMessageConverters 不會自動注入。

于是自己在配置文件中,直接復(fù)制源碼的 Bean,最終成功。

# 新建配置類
@Configuration
public class WebFluxWithOpenFeignConfig {
    @Bean
    @ConditionalOnMissingBean
    public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
        return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
    }
}

總結(jié)

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

相關(guān)文章

  • spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法

    spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法

    這篇文章主要介紹了關(guān)于spring的構(gòu)造函數(shù)注入屬性@ConstructorBinding用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Tomcat內(nèi)存溢出分析及解決方法

    Tomcat內(nèi)存溢出分析及解決方法

    堆是給開發(fā)人員用的上面說的就是,是在JVM啟動時創(chuàng)建;非堆是留給JVM自己用的,用來存放類的信息的,本文將詳細(xì)介紹Tomcat內(nèi)存溢出,需要了解更多的朋友可以參考下
    2012-11-11
  • Java利用剪貼板實現(xiàn)交換程序間數(shù)據(jù)的方法

    Java利用剪貼板實現(xiàn)交換程序間數(shù)據(jù)的方法

    這篇文章主要介紹了Java利用剪貼板實現(xiàn)交換程序間數(shù)據(jù)的方法,需要的朋友可以參考下
    2014-07-07
  • Spring Shell開發(fā)自定義命令行工具詳解

    Spring Shell開發(fā)自定義命令行工具詳解

    Spring Shell是Spring生態(tài)系統(tǒng)中的一個強大組件,它允許開發(fā)者輕松創(chuàng)建功能豐富的命令行,本文將介紹如何在Spring Boot項目中集成和使用Spring Shell,開發(fā)自定義命令,需要的可以了解下
    2025-07-07
  • 阿里的Easyexcel讀取Excel文件的方法(最新版本)

    阿里的Easyexcel讀取Excel文件的方法(最新版本)

    這篇文章主要介紹了阿里的Easyexcel讀取Excel文件(最新版本)的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 淺談Java編程之if-else的優(yōu)化技巧總結(jié)

    淺談Java編程之if-else的優(yōu)化技巧總結(jié)

    說實話,其實我很討厭在代碼里大量使用if-else,一是因為該類代碼執(zhí)行方式屬于面向過程的,二嘛,則是會顯得代碼過于冗余.這篇筆記,主要記錄一些自己在工作實踐當(dāng)中針對if-else的優(yōu)化心得,將會不定期地長期更新,需要的朋友可以參考下
    2021-06-06
  • 面試官問如何啟動Java?線程

    面試官問如何啟動Java?線程

    這篇文章主要介紹了面試官問如何啟動Java?線程,Java?的線程創(chuàng)建和啟動非常簡單,但如果問一個線程是怎么啟動起來的往往并不清楚,甚至不知道為什么啟動時是調(diào)用start(),而不是調(diào)用run()方法呢?下面我們就一起進入文章學(xué)習(xí)這個問題吧
    2021-12-12
  • SpringBoot后端上傳文件類型檢測方式

    SpringBoot后端上傳文件類型檢測方式

    這篇文章主要介紹了SpringBoot后端上傳文件類型檢測方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • JAVA實現(xiàn)數(shù)字大寫金額轉(zhuǎn)換的方法

    JAVA實現(xiàn)數(shù)字大寫金額轉(zhuǎn)換的方法

    這篇文章主要介紹了JAVA實現(xiàn)數(shù)字大寫金額轉(zhuǎn)換的方法,涉及java針對字符串與數(shù)組的遍歷與轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Java基礎(chǔ)之Filter的實例詳解

    Java基礎(chǔ)之Filter的實例詳解

    這篇文章主要介紹了Java基礎(chǔ)之Filter的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

合肥市| 龙游县| 滕州市| 综艺| 松溪县| 二手房| 和顺县| 仙游县| 屯留县| 海林市| 武乡县| 汾阳市| 昌图县| 绵竹市| 娄底市| 中牟县| 福州市| 紫阳县| 安西县| 十堰市| 新田县| 余江县| 平顺县| 高淳县| 德安县| 错那县| 信阳市| 漠河县| 平乐县| 柳河县| 永和县| 宜君县| 卫辉市| 长武县| 七台河市| 大名县| 大冶市| 台南县| 昂仁县| 阿拉善左旗| 天水市|