为什么 @RequestBody 在没有 setter 的情况下工作?

Why @RequestBody works without setters?

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

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

这是用户 class:

@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)

所以当我用正文POST打电话时

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

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

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

这是一个关于 Jackson 的相关问题,以及为什么它不需要 setter