fix: 修复金蝶付款处理查询响应缺失Content-Type导致解码失败

This commit is contained in:
刘泉佳
2026-11-03 18:20:59 +08:00
parent debb8e955f
commit 847a9cae23
@@ -27,14 +27,20 @@ package org.springblade.thirdparty.bfi.config;
import feign.Request;
import feign.RequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springblade.thirdparty.bfi.interceptor.BfiRequestInterceptor;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
@@ -71,4 +77,26 @@ public class BfiFeignClientConfig {
public Encoder feignFormEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
/**
* BFI 专用解码器:金蝶部分接口成功响应缺失 Content-Type 头(kong 网关 chunked 转发丢失,
* 如 cas_paybill/query),默认解码器按 application/octet-stream 匹配不到 JSON 转换器导致
* "no suitable HttpMessageConverter" 解码失败。缺失 Content-Type 时强制按 JSON 解码,
* 其余响应保持默认解码逻辑(含二进制下载接口)
*/
@Bean
public Decoder bfiDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {
SpringDecoder defaultDecoder = new SpringDecoder(messageConverters);
MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
jacksonConverter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON, MediaType.ALL));
SpringDecoder forceJsonDecoder = new SpringDecoder(() -> new HttpMessageConverters(jacksonConverter));
return (response, type) -> {
boolean missingContentType = response.headers().keySet().stream()
.noneMatch("content-type"::equalsIgnoreCase);
if (missingContentType) {
return forceJsonDecoder.decode(response, type);
}
return defaultDecoder.decode(response, type);
};
}
}