首页 > 解决方案 > Spring Boot jackson non_null 属性不起作用

问题描述

我正在使用 Spring boot 1.5.7-RELEASE

我正在尝试在我的应用程序中设置全局非 null Jackson 属性。

但它不工作。

我在 application.properties 和 bootstrap.properties 中都尝试过,但都没有工作。

spring.jackson.default-property-inclusion=NON_NULL
spring.jackson.serialization-inclusion=NON_NULL

但是当我在课堂上申请时,它工作正常。

@JsonInclude(JsonInclude.NON_NULL)

标签: spring-bootjackson

解决方案


根据文档,正确答案是:

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()然后我在上述构建器类的方法中放置一个断点,并在调试模式下运行我的应用程序。

我发现ObjectMapper在应用程序启动期间创建了 8 个实例,其中只有一个是使用application.properties文件内容配置的。OP 从未指定他使用序列化的准确程度,因此他的代码可能引用了其他 7 个可用的对象映射器之一。

无论如何,确保应用程序中的所有对象映射器都配置为仅序列化非空属性的唯一方法是创建自己的类副本org.springframework.http.converter.json.Jackson2ObjectMapperBuilder并将该选项硬编码为默认值,或者自定义类以application.properties在每次调用期间读取到它的构造函数或构建方法。


推荐阅读