【问题标题】:Why @RequestBody works without setters?为什么@RequestBody 在没有设置器的情况下工作?
【发布时间】:2022-02-02 12:54:09
【问题描述】:

我正在编写一个带有注释@RequestBody 的控制器,以便映射到一个Java 对象。使用注解的方法是:

@PostMapping("/users")
public ResponseEntity<Object> createUserForProject(@Valid @RequestBody User user) {
        log.info("Creating a user " + user.getEmail());
}

这是用户类:

@Getter
@AllArgsConstructor
@Slf4j
@EqualsAndHashCode
@ToString
public class User {
    @NotEmpty
    @Email
    private String email;

    @NotEmpty
    private String firstName;

    @NotEmpty
    private String lastName;

    @JsonIgnore
    private Optional<LocalDate> lastLogonDate = Optional.empty();

    @JsonIgnore
    private Optional<LocalDate> lastModificationDate = Optional.empty();

    @JsonIgnore
    private Optional<LocalDate> creationDate = Optional.empty();

    @JsonIgnore
    private Optional<LocalDate> mfaWarningDate = Optional.empty();

    @JsonIgnore
    private Optional<LocalDate> auditStartNotificationDate = Optional.empty();

    @JsonIgnore
    private boolean enabled = true;

    public User() {
        log.info("HI");
    }

    (More code without explicit setters)

所以当我用 body 进行 POST 调用时

{
   "email":"test@test.com",
   "firstName":"testName",
   "lastName":"testLastName"
}

输出 HI 和带有 Creating a user test@test.com 消息的日志,因此创建了对象。我的意思是......为什么这真的有效? HttpMessageConverter 正在调用无参数构造函数,并且在使用构造函数创建对象后没有要调用的设置器。对象属性如何在没有任何设置器的情况下获取它们的值?我在这里错过了什么?

【问题讨论】:

  • Setter 是为人类服务的,计算机不需要它们。即使是final 变量也只是一种心态,当你反思自己时,你可以改变它的价值。修改 private 变量更不值一提。
  • 你的班级User 被注释为@AllArgsConstructor 而不是@NoArgsConstructor。因此它没有无参数构造函数,而是一个将所有字段作为参数的构造函数。由于构造函数注入,它可能会起作用。
  • 我创建了一个无参数构造函数public User() {log.info("HI");},这就是为什么我不使用注释@NoArgsConstructor。实际上是调用它来创建对象。

标签: java spring-boot spring-mvc


【解决方案1】:

Spring boot 使用 Jackson 进行 Object JSON 转换,Jackson 不需要 setter,它通过反射设置字段。

这是关于杰克逊的一个相关问题,以及为什么它不需要二传手 How does jackson set private properties without setters?

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2021-04-02
    相关资源
    最近更新 更多