我正在使用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)
答案 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);
}
}