Feign呼び出しサービスエラー:No qualifying bean of type`HttpMessage Coverters`


記事の目次
  • Feignコールサービスエラー
  • 問題
  • エラーコード
  • ソリューション
  • 原因
  • HTTPプロトコルが規範化されていない場合、Decoder
  • を配置する必要がある。
  • 構成コード
  • Feignコールサービスエラー
    問題
    今日はGatewayゲートウェイでFeign遠隔通話サービスの利用を試みた時、エラーが発生しました。記録してください。
    エラーコード
    feign.codec.DecodeException: 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.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:182) ~[feign-core-10.4.0.jar:na]
    	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    Error has been observed at the following site(s):
    	|_ checkpoint ⇢ org.springframework.web.cors.reactive.CorsWebFilter [DefaultWebFilterChain]
    	|_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    	|_ checkpoint ⇢ HTTP GET "/addCart/14" [ExceptionHandlingWebHandler]
    
    ソリューション
    原因
    いくつかの記事を調べてみましたが、Gatewayがhttpプロトコルを使っていると思います。Feignもそうですが、Feignのデコーダが配置されていません。復号に問題があります。今はまだよく分かりません。まず記録して、後で勉強したら完璧です。
    Feignは、方法署名における方法パラメータオブジェクトを、HTTP要求に要求パラメータとしてプログレッシブ化するプロセスを、エンコーダによって実行する。同じように、HTTP応答データをjavaオブジェクトに逆プログレッシブ化することは、デコーダ(Decoder)によって行われる。
    HTTPプロトコルが規範化されていない場合、Decoderを配置する必要があります。
    コードの設定
    @SpringBootConfiguration
    public class FeignConfig {
        @Bean
        public Decoder feignDecoder() {
            return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
        }
    
        public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
            final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new GateWayMappingJackson2HttpMessageConverter());
            return new ObjectFactory<HttpMessageConverters>() {
                @Override
                public HttpMessageConverters getObject() throws BeansException {
                    return httpMessageConverters;
                }
            };
        }
    
        public class GateWayMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
            GateWayMappingJackson2HttpMessageConverter(){
                List<MediaType> mediaTypes = new ArrayList<>();
                mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8"));
                setSupportedMediaTypes(mediaTypes);
            }
        }
    }
    
    参照ドキュメント:リンク:Decoderリンクについて:設定コードについて