我在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方法。