【发布时间】:2022-01-17 15:10:28
【问题描述】:
我有 REST API 应用程序,当我创建一个具有相同用户名的用户时,它始终创建,但我希望用户名是唯一的,因为在实际应用程序中用户名对于每个用户都是唯一的,我如何提供检查数据库中的用户名? 当我使用已经存在的用户名创建用户时,我希望我的应用程序抛出一些消息,当然,不要保存已经存在的新用户用户名
我的用户实体:
@Table(name = "usr", uniqueConstraints=
@UniqueConstraint(columnNames={"username", "email"}))
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "role")
private Role role;
@Column(name = "email")
private String email;
@Column(name = "status")
private Status status;
// @OneToMany(mappedBy = "author")
// private List<Message> messages;
// @OneToMany(mappedBy = "author")
// private List<Comment> comments;
@OneToOne
@JoinColumn(name = "gender_id")
private Gender gender;
@OneToOne
@JoinColumn(name = "address_id")
private Address address;
@ManyToMany
@JoinTable(
name = "user_subscriptions",
joinColumns = @JoinColumn(name = "channel_id") ,
inverseJoinColumns = @JoinColumn(name = "subscriber_id"))
private Set<User> subscribers;
@ManyToMany
@JoinTable(
name = "user_subscriptions",
joinColumns = @JoinColumn(name = "subscriber_id") ,
inverseJoinColumns = @JoinColumn(name = "channel_id"))
private Set<User> subscriptions;
@OneToOne
@JoinColumn(name = "file_id")
private FileEntity fileEntity;
我的用户服务:
@Transactional
public User save(UserRequest user) {
provideAllUserCheckingActionsForSave(user);
User userUntilSave = userMap.userRequestToUser(user,Role.USER,Status.ACTIVE);
userUntilSave.setPassword(passwordEncoder.encode(userUntilSave.getPassword()));
User saved = userRepo.save(userUntilSave);
log.info("User save method invoked");
return saved;
}
【问题讨论】:
-
Spring 具有向控制器添加验证的能力:docs.spring.io/spring-framework/docs/3.2.x/… 您可以编写一个控制器类,该类将简单地调用数据库查询以检查用户名不存在。
-
进行查询不是保证。在用户名字段上创建唯一索引并捕获异常并显示您想要的消息。
-
@M.Deinum 你能告诉我更多细节吗?
-
您对用户名和电子邮件都有唯一的限制 - 这意味着您可以让多个用户使用相同的用户名,只要他们有不同的电子邮件地址 - 只有组合必须是唯一的。您可能需要单独的约束,一个用于用户名,一个用于电子邮件地址,以便在用户名用于其他人时引发异常。
-
@Chris 你能告诉我更多细节吗?
标签: java spring postgresql hibernate jpa