【发布时间】: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