feign无法解析text/x-json类型的返回参数
时间: 2024-04-26 15:22:22 浏览: 166
Feign 默认使用的是 Jackson 库来进行 JSON 数据的解析,而 Jackson 对于 Content-Type 为 application/json 的数据格式可以自动进行解析,但对于 Content-Type 为 text/x-json 的数据格式不支持。
有两种解决方法:
1. 修改服务端返回的 Content-Type 类型为 application/json,这样 Feign 就能自动解析了。可以在服务端的代码中修改返回头的方式如下:
```java
@GetMapping("/xxx")
public ResponseEntity<?> xxx() {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_TYPE, "application/json");
return new ResponseEntity<>(data, headers, HttpStatus.OK);
}
```
2. 自定义 Feign 的解码器,让 Feign 支持 text/x-json 数据类型。具体实现方式如下:
1. 创建自定义解码器类,继承 `ResponseEntityDecoder` 并实现 `decode` 方法,代码如下:
```java
import feign.Response;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public class TextJsonDecoder implements Decoder {
private final List<HttpMessageConverter<?>> messageConverters;
public TextJsonDecoder() {
this.messageConverters = new ArrayList<>();
this.messageConverters.add(new MappingJackson2HttpMessageConverter());
}
public TextJsonDecoder(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = messageConverters;
}
@Override
public Object decode(Response response, Type type) throws IOException, DecodeException {
if (response.status() == HttpStatus.NO_CONTENT.value()) {
return null;
}
if (response.body() == null) {
return null;
}
try {
String body = StreamUtils.copyToString(response.body().asInputStream(), Charset.forName("UTF-8"));
HttpHeaders headers = new HttpHeaders();
headers.putAll(response.headers());
for (HttpMessageConverter<?> messageConverter : messageConverters) {
if (messageConverter.canRead(type, null)) {
return ((HttpMessageConverter<Object>) messageConverter).read(type, null, response);
}
}
return new ResponseEntity<>(body, headers, response.status());
} catch (Exception e) {
throw new DecodeException(e.getMessage(), e);
}
}
}
```
2. 在 Feign 的配置类中,将自定义解码器添加到 Feign 中,代码如下:
```java
import feign.codec.Decoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Decoder decoder() {
return new TextJsonDecoder();
}
}
```
经过上述操作后,Feign 就可以支持解析 Content-Type 为 text/x-json 的数据格式了。
阅读全文