Rav*_*lor 4 jackson spring-boot
我正在使用 Spring Boot 1.5.7-RELEASE。
我正在尝试在我的应用程序中设置全局非空Jackson 属性。
但它不起作用。
我在 application.properties 和 bootstrap.properties 中都尝试过,但没有工作。
spring.jackson.default-property-inclusion=NON_NULL
spring.jackson.serialization-inclusion=NON_NULL
Run Code Online (Sandbox Code Playgroud)
但是当我在课堂上申请时,它工作正常。
@JsonInclude(JsonInclude.NON_NULL)
Run Code Online (Sandbox Code Playgroud)
根据文档,正确答案是:
spring.jackson.default-property-inclusion=non_null
Run Code Online (Sandbox Code Playgroud)
(注意小写的 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>
Run Code Online (Sandbox Code Playgroud)
然后我添加了以下控制器和响应类(使用 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;
}
Run Code Online (Sandbox Code Playgroud)
最后,我根据文档配置了 Jackson,运行应用程序并导航到http://localhost:8080/jackson/test. 结果是(如预期的那样):
{"field1":""}
Run Code Online (Sandbox Code Playgroud)
之后,我深入研究了 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在每次调用期间读取到它的构造函数或构建方法。
| 归档时间: |
|
| 查看次数: |
12297 次 |
| 最近记录: |