根据documentation,正确答案是:
spring.jackson.default-property-inclusion=non_null
(注意小写的 non_null - 这可能是您的问题的原因)
编辑:
我创建了一个简单的 Spring Boot 1.5.7.RELEASE 项目,只有以下两个编译依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
然后我添加了以下控制器和响应类(使用 Lombok 跳过一些样板代码):
@RestController
@RequestMapping("/jackson")
public class JacksonTestController {
@GetMapping("/test")
public Response test() {
val response = new Response();
response.setField1("");
return response;
}
}
@Data
class Response {
private String field1;
private String field2;
private Integer field3;
}
最后我按照文档配置了 Jackson,运行应用程序并导航到 http://localhost:8080/jackson/test。结果是(如预期的那样):
{"field1":""}
之后,我深入研究了 Spring Boot 的源代码,发现 Spring 使用类 org.springframework.http.converter.json.Jackson2ObjectMapperBuilder 来创建 com.fasterxml.jackson.databind.ObjectMapper 的实例。然后,我在上述构建器类的方法public <T extends ObjectMapper> T build() 中放置一个断点,并在调试模式下运行我的应用程序。
我发现在应用程序启动期间创建了 8 个ObjectMapper 实例,其中只有一个是使用application.properties 文件的内容配置的。 OP 从未具体说明他是如何使用序列化的,因此他的代码可能引用了其他 7 个可用的对象映射器之一。
无论如何,确保应用程序中的所有对象映射器都配置为仅序列化非空属性的唯一方法是创建自己的 org.springframework.http.converter.json.Jackson2ObjectMapperBuilder 类副本并将该选项硬编码为默认值或自定义在每次调用它的构造函数或构建方法时读取application.properties 的类。