曹耘豪的博客

Spring Cloud之Feign请求空对象时报错

  1. 问题复现
  2. 解决方法
  3. 原理分析

问题复现

Feign接口定义如下

1
2
@PostMapping("call")
Response call(@RequestBody Request request);

其中 Request 为空对象

1
2
3
4
@Data
public class Request {

}

调用方执行时会出错

1
feign.codec.EncodeException: Could not write request: no suitable HttpMessageConverter found for request type

解决方法

方案1:调用方增加配置(推荐)

1
spring.jackson.serialization.fail-on-empty-beans=false

方案2:body不使用空对象

原理分析

Spring Feign使用HttpMessageConverters处理请求体,最终我们希望是MappingJackson2HttpMessageConverter来序列化我们的body对象,但前提需要通过它的canWrite方法,方法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Override
public boolean canWrite(Class<?> clazz, @Nullable MediaType mediaType) {
if (!canWrite(mediaType)) {
return false;
}
if (mediaType != null && mediaType.getCharset() != null) {
Charset charset = mediaType.getCharset();
if (!ENCODINGS.containsKey(charset.name())) {
return false;
}
}
AtomicReference<Throwable> causeRef = new AtomicReference<>();
if (this.objectMapper.canSerialize(clazz, causeRef)) {
return true;
}
logWarningIfNecessary(clazz, causeRef.get());
return false;
}

注意其中的canSerialize方法,当ObjectMapper开启fail-on-empty-beans时(也是默认开启),canSerialize(Object.class)将返回false

所以我们需要关闭Spring管理的ObjectMapper的fail-on-empty-beans选项

   / 
  ,