У меня есть приложение 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;
    }
0
stan 17 Янв 2022 в 18:10
Spring поставляется с возможностью добавления проверки к контроллерам: docs.spring.io/spring-framework/docs/3.2.x/… вы можете написать класс контроллера, который просто вызовет запрос к базе данных, чтобы проверить, что имя пользователя еще не существует.
 – 
mohammedkhan
17 Янв 2022 в 18:12
5
Выполнение запроса не является гарантией. Создайте уникальный индекс в поле имени пользователя, поймайте исключение и покажите нужное сообщение.
 – 
M. Deinum
17 Янв 2022 в 18:20
@M.Deinum, можешь рассказать подробнее?
 – 
stan
17 Янв 2022 в 18:25
4
У вас есть уникальное ограничение как для имени пользователя, так и для электронной почты — это означает, что у вас может быть несколько пользователей с одним и тем же именем пользователя, если у них разные адреса электронной почты — только комбинация должна быть уникальной. Вам могут понадобиться отдельные ограничения, одно для имени пользователя и одно для адреса электронной почты, чтобы возникало исключение, если имя пользователя используется для кого-то другого.
 – 
Chris
17 Янв 2022 в 18:25
Можешь рассказать подробнее?
 – 
stan
17 Янв 2022 в 18:28

3 ответа

Вы можете добавить проверку в контроллер или просто сделать это следующим образом: - Когда пользователь хочет зарегистрироваться, получите имя пользователя и выполните поиск в базе данных, существует ли оно уже или нет. Если findByUsername(username) возвращает значение null, выполните следующую операцию и зарегистрируйте пользователя, иначе верните сообщение об ошибке.

1
Vikas Vaibhav 18 Янв 2022 в 08:50

Вы можете использовать аннотацию @unique для хранения уникальных значений в базе данных, и если она выдает исключение из-за того, что не принимает уникальное значение, исключение должно быть обработано.

1
Ashwini Karnale 18 Янв 2022 в 09:49

Перед созданием пользователя вы можете выполнить поиск пользователя по имени пользователя, если результат поиска пуст, затем создать нового пользователя, если результат поиска не пуст, решить вопрос.

0
liuxiuxue 18 Янв 2022 в 04:24