java - @JsonInclude(Include.NON_NULL) 如何在 Spring Boot 中工作

标签 java spring spring-mvc spring-boot jackson

我试图了解 @JsonInclude 存在的原因是什么,以便在我的 DTO 中使用它。让我们看一下这个简单的例子:

代码:

class DemoApplication {
    static void main(String[] args) {
        SpringApplication.run DemoApplication, args
    }
    @PostMapping("/")
    String greet(@RequestBody Greeting greeting) {
        return "Hello ${greeting.name}, with email ${greeting.email}"
    }
}

@JsonInclude(JsonInclude.Include.NON_NULL)
class Greeting {
  String name
  String email
}

B代码:

class DemoApplication {
    static void main(String[] args) {
        SpringApplication.run DemoApplication, args
    }
    @PostMapping("/")
    String greet(@RequestBody Greeting greeting) {
        return "Hello ${greeting.name}, with email ${greeting.email}"
    }
}

class Greeting {
  String name
  String email
}

A 代码B 代码 之间的唯一区别是,在B 代码 中,问候类不使用@JsonInclude 注解。

但如果我对该端点(A 代码B 代码)执行一些简单的 CURL 请求:

~ curl -H "Content-Type: application/json" -X POST localhost:8080
{"timestamp":"2018-04-22T21:18:39.849+0000","status":400,"error":"Bad Request","message":"Required request body is missing: public java.lang.String com.example.demo.DemoApplication.greet(com.example.demo.Greeting)","path":"/"}
~ curl -H "Content-Type: application/json" -X POST localhost:8080  -d '{}'
Hello null, with email null                                                                     
~ curl -H "Content-Type: application/json" -X POST localhost:8080  -d '{"name": "AlejoDev"}'
Hello AlejoDev, with email null                                                                    
~ curl -H "Content-Type: application/json" -X POST localhost:8080  -d '{"name": "AlejoDev", "email":"info@alejodev.com"}'
Hello AlejoDev, with email info@alejodev.com

得到相同的行为,那么使用@JsonInclude注解的效用是什么?

例如,我希望在 A 代码 中发送一个只有一个字段的请求,如下所示:

~ curl -H "Content-Type: application/json" -X POST localhost:8080  -d '{"name": "AlejoDev"}'

Greeting 对象 变成了只有一个字段的对象,而不是有两个字段的对象。一满一空。

最佳答案

那个注解的意思是当一个对象被反序列化时是否只包含非空字段。

当您将它用于作为输入获取的对象时,即使输入字段为空,因为变量 nameemail 是类级别的字段,它们将被初始化为默认值 null。

因此,当您创建 return 语句时,您总是会得到 null。

尝试将此注解与 JSON 对象作为响应,然后尝试填充一些字段并将一些字段保持为空,然后查看对各种调用的响应。这将帮助您了解此注释的效果。

关于java - @JsonInclude(Include.NON_NULL) 如何在 Spring Boot 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49988125/

相关文章:

带有@PreAuthorize 注解的java.lang.NoSuchMethodError

java - bean 名称 ' ' 的 BindingResult 和普通目标对象都不能用作请求属性

Spring 4 Hibernate 验证器本地化消息

java - Spring和JSP文件的动态包含

java - 将我的 hibernate Dao 层移植到独立的 Java 应用程序中?

java - 无法从静态调用非静态方法 - 同一个类

java - 在 JPanel 上绘图

java - 是否可以使用 Jackson 附加属性进行序列化?

javascript - Handsontable粘贴不起作用

java - 如何通过正则表达式分割字符串