杰克逊ObjectMapper忽略了JsonInclude.Include.NON_NULL

时间:2019-01-04 15:27:04

标签: spring-boot serialization jackson annotations

我在Spring Boot 1.5.2中有一个项目。由于某些原因,我无法使ObjectMapper在序列化期间忽略空字段。设置如下:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class CustomerInfo{
  private Long customerId;
  private String fullName;
  //some more fields
  //getters and setters
}

@Service
public class ObjectMapperTester{
  @Autowired
  private ObjectMapper objectMapper;

  public void test(){
     CustomerInfo ci = new CustomerInfo;
     ci.setFullName("Foo");
     objectMapper.writeValueAsString(ci);
     //I get JsonMappingException here
  }
}

到目前为止,我一直在类中使用@JsonInclude(JsonInclude.Include.NON_NULL)批注来忽略空字段。当我在RestController方法中返回任何类型的对象时,该方法效果很好,因此在响应输出中看不到任何null字段。但是这个人不肯工作。当customerId字段为null时,尝试写入ValueAsString时出现异常。 ObjectMapper试图通过getter获取customerId值,而后者又执行以下操作:

 //In fact compiler transforms the getter to be so, otherwise I just return the customerId.
 return this.customerId.longValue();

那当然会引发NullPointerException。

我尝试通过这种方式手动指示映射器忽略空字段:

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

但这也无济于事。还有其他想法吗?

更新

我已经弄清楚了问题所在。实际上,customerId字段的类型曾经是原始的long。然后我将其更改为Long,而没有使用IDE重构,这使吸气剂像这样:

public long getCustomerId(){
  return customerId;
}

然后编译器将其转换为

public long getCustomerId(){
  return customerId.longValue();
}

将getter返回类型固定为Long之后,问题就解决了,我的确没有在输出中得到customerId字段。但是,仍将调用getCustomerId()方法。这就是为什么我说sort of。如果要忽略它,为什么映射器需要调用getter?我试过删除全班级注释,并将其添加到字段中。但是,仍然会调用getter方法。

0 个答案:

没有答案