为什么 @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
我正在编写带有注释 @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