【发布时间】:2021-07-17 20:36:19
【问题描述】:
我有一个现有系统,它为用户使用基于字符串的唯一 ID,我想将该系统转移到 Spring 引导应用程序中。我想创建一个用户,所以我发送一个包含以下内容的 POST 请求:
如您所见,id 被忽略。 这是我的用户类 Spring 代码:
@PostMapping("/user")
ResponseEntity addUser(User receivedUser) {
Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
logger.info("Empfangener User: " + receivedUser.toString());
try {
User mailCheckUser = userService.getUserByMail(receivedUser.getEmail());
User nameCheckUser = userService.getUserByName(receivedUser.getUsername());
if (mailCheckUser != null){
return new ResponseEntity("Email already exists", HttpStatus.NOT_ACCEPTABLE);
}
if (nameCheckUser != null){
return new ResponseEntity("Username already exists", HttpStatus.NOT_ACCEPTABLE);
}
userService.addUser(receivedUser);
} catch (Exception userCreationError) {
return new ResponseEntity(receivedUser, HttpStatus.INTERNAL_SERVER_ERROR);
}
return new ResponseEntity(receivedUser, HttpStatus.OK);
}
public void addUser(User user) {
userRepository.save(user);
}
这是我的用户类:
@Entity
@Table
public class User {
@Id
@Column(unique =true)
private String id;
private @Column(unique =true)
String username;
private @Column(unique =true)
String email;
private @Column(unique =true)
String simpleAuthToken;
private
String password;
/*REDACTED*/
private
boolean isBlocked;
public User(String id, String name, String email, boolean isBlocked) {
this.id = id;
this.username = name;
this.email = email;
this.simpleAuthToken = simpleAuthToken;
this.isBlocked = false;
}
public User() {
}
/*GETTERS AND SETTERS ARE HERE, BUT I CUT THEM FOR SPACING REASONS*/
}
我的预期结果是 Spring 会识别该 id,然后使用我提供的 id 创建一个用户。为什么id总是为空?
编辑:如果我将 ID 放入 Put 或 Get Mapping 作为 Path 变量,如下所示:
@PutMapping("/user/{id}")
ResponseEntity updateUser(@PathVariable String id, User receivedUser) {}
然后它会被读取和识别,但它在receivedUser中仍然为空
【问题讨论】:
-
您是否尝试过在
User构造函数和setId中删除断点以查看spring 是如何构造实体的?我以为它会调用无参数构造函数和设置器。 -
刚刚这样做了,spring 确实使用了空构造函数。这让我想知道用户名是如何进入用户的。有没有办法强制spring使用args构造函数?
-
我认为它是使用无参数构造函数构造一个空对象,然后使用设置器。您是否在 setUsername 和 setId 中放置了断点?我的问题是 setId 出了什么问题。
-
我没有设置用户名或 ID,因为我的 userService.addUser 所做的只是将用户保存到存储库(它可以工作,但 id 为 null 是问题)。删除 no args 构造函数后,id 被正确读取,但我仍然收到内部服务器错误。我目前正在调查
-
我忘了删除默认构造函数会导致发送 GET 请求时出现异常。如您所见,我的构造函数已经设置了一些值,但没有被使用。您知道为什么会发生这种情况吗?
标签: spring spring-boot spring-data-jpa