У меня есть приложение REST API, и когда я создаю пользователя с тем же именем пользователя, оно создается все время, но я хочу, чтобы имя пользователя было уникальным, потому что в реальных приложениях имя пользователя уникально для каждого пользователя, как я могу обеспечить проверку имени пользователя в db? Я хочу, чтобы мое приложение выдавало какое-то сообщение, когда я создаю пользователя с уже существующим именем пользователя, и, конечно, не сохраняло новое имя пользователя, которое уже существует.
Моя пользовательская сущность:
@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;
}
3 ответа
Вы можете добавить проверку в контроллер или просто сделать это следующим образом: - Когда пользователь хочет зарегистрироваться, получите имя пользователя и выполните поиск в базе данных, существует ли оно уже или нет. Если findByUsername(username) возвращает значение null, выполните следующую операцию и зарегистрируйте пользователя, иначе верните сообщение об ошибке.
Вы можете использовать аннотацию @unique для хранения уникальных значений в базе данных, и если она выдает исключение из-за того, что не принимает уникальное значение, исключение должно быть обработано.
Перед созданием пользователя вы можете выполнить поиск пользователя по имени пользователя, если результат поиска пуст, затем создать нового пользователя, если результат поиска не пуст, решить вопрос.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].