问题描述
1、需要请求二方feginClient接口查询相关业务信息(请求方式 POST)
@PostMapping(path = "/v1/xxx")
DataResponse<XXXResponseDTO> batchGetxxx(@RequestBody XXXRequestDTO dto);
2、奇葩要求:入参的所有字段即使为null也需要传递,举个例子:
XXXRequestDTO 有两个字段:
{
"productNo":"xxx", // 字符串类型
"bizType":xxx // Interger类型
}
当bizType为null时,需要入参如下:
{
"productNo":"xxx",
"bizType":null
}
如果入参如下,则会参数检测不通过
{
"productNo":"xxx"
}
解决方式
feginClient接口定义
// 注意请求头是必须的
@PostMapping(path = "/v1/xxx" headers = {"Content-Type=application/json"})
DataResponse<XXXResponseDTO> batchGetxxx(String json);
调用时
// 使用jackson序列化,自主选择如何系列化方式
ObjectMapper objectMapper = new ObjectMapper();
String jsonReq = objectMapper.writeValueAsString(dto);
// 发起调用
xxxClient.batchGetxxx(jsonReq);
问题说明
1、因为springBoot默认采用了jackson序列化对象,通常项目会默认统一配置序列化方式,对于 @RequestBody 标记的对象如若属性值为null,通常不会序列化(序列化其实也很奇怪)
2、因此如若需要实现特殊接口特殊处理,上诉方式是比较自由的
3、当然,我也研究了诸如自定义Feign的Encoder和Decoder、配置@FeignClient的configuration = ObjectMapperConfig.class等方式,但是没有预期效果,又不想再深入研究(不想占用太多时间),因此选择了该方式