Spring Boot Jackson的non_null属性不起作用

时间:2018-07-10 09:33:54

标签: spring-boot jackson

我正在使用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)

3 个答案:

答案 0 :(得分:1)

根据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个可用的对象映射器之一。

无论如何,确保将应用程序中的所有对象映射器配置为仅序列化非null属性的唯一方法是创建自己的类org.springframework.http.converter.json.Jackson2ObjectMapperBuilder的副本,并将其硬代码设置为default或自定义该类以在每次对其构造函数或build方法的调用期间读取application.properties

答案 1 :(得分:0)

我只是在处理application.properties中的设置,而没有采用任何一种。就我而言,有一个我正在扩展的抽象配置类,它定义了一个具有完全不同设置的ObjectMapper bean。所以我不得不重写它。

什么使我找到了使用Spring Boot应用程序具有的/ beans Actuator端点并搜索'ObjectMapper'的地方。它揭示了一个我没有意识到正在创建的实例。

答案 2 :(得分:0)

也许我聚会晚了,但可能会帮助某人。

扩展WebMvcConfigurationSupport类并以所需方式自定义Springboot配置。

@Configuration
public class Config extends WebMvcConfigurationSupport{

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        converter.setObjectMapper(mapper);
        converters.add(converter);
        super.configureMessageConverters(converters);
    }
}