一、写在前面
记录工作中遇到的序列化和反序列化出现的问题。
二、空串
1、背景:SpringBoot+SpringCloud构建的多个微服务项目,服务调用使用openfeign
//服务A:接口提供者
@GetMapping(value = "/name")
public String getName(@RequestParam(name = "userId") Integer userId) {
return "";
}
//服务B:请求服务A接口
@GetMapping(value = "/name")
public String getName(@RequestParam(name = "userId") Integer userId) {
StringBuilder sb = new StringBuilder();
sb.append("student-");
//1、服务调用
sb.append(A.getName(userId).replace("\"", ""));
return sb.toString();
}
问题:当服务A配置了fastjson作为HttpMessageConverter,服务B在1处会抛出空指针异常
原因:在服务A中返回的是空串,使用fastjson序列化出去的是两个双引号"""",HttpHeader里Content-Length=2,而jackson序列化出去就是空串"",HttpHeader里的Content-Length=0,在feign解析代码里org.springframework.web.client.HttpMessageConverterExtractor#extractData,先判断了Content-Length,如果是0就返回null了
//org.springframework.cloud.openfeign.support.SpringDecoder#decode
public Object decode(final Response response, Type type) throws IOException, FeignException {
if (!(type instanceof Class) && !(type instanceof ParameterizedType) && !(type instanceof WildcardType)) {
throw new DecodeException("type is not an instance of Class or Param