Где я должен проверить, существует ли имя пользователя уже в rest api?

#java #spring #rest #validation

#java #весна #rest #проверка

Вопрос:

Я создаю приложение rest с помощью Spring Boot. У меня есть три логических уровня: контроллер, служба и репозиторий. Где я должен проверить, существует ли данное имя пользователя и аналогичные значения в базе данных?

На уровне контроллера я проверяю ввод пользователя (длина, размер и т.д.). Могу ли я также проверить наличие имени пользователя здесь? Например:

 if(this.userService.existUserByUsername(request.getUsername()))
        throw new ResponseStatusException(
                HttpStatus.CONFLICT, "User with given username already exists");
 

Могу ли я проверить это на уровне сервиса, вызвав метод реестра (existByUsername) и выдав пользовательскую ошибку, затем обнаруженную в контроллере?

 public void addUser(SignUpRequestDto signUpRequestDto){
    
    if(this.userRepository.existsByUsername(signUpRequestDto.getUsername()))
        throw new UserAlreadyExistException("User with given uusernamealready exist");
    else
        this.userRepository.save(this.convertSignUpRequestDtoToEntity(signUpRequestDto));
}
 

Или, может быть, я должен полагаться на аннотации hibernate для объектов и обрабатывать эти исключения?

 @NotNull
@Column(name = "username", unique = true)
private String username;
 

Я действительно ценю все ваши отзывы.

Ответ №1:

Где я должен проверить, существует ли данное имя пользователя и аналогичные значения в базе данных?

Вероятно, в том же логическом слое, что и остальная часть вашей бизнес-логики. Уровень обслуживания?

На уровне контроллера я проверяю вводимые пользователем данные (длина, размер и т.д.). Могу ли я также проверить наличие имени пользователя здесь?

Вы можете, конечно. Вероятно, это не очень хорошая идея; анализ входных данных, чтобы убедиться, что они соответствуют схеме, которую вы понимаете, является пограничной проблемой. Использование входных данных, которые вы понимаете, является проблемой домена.

Могу ли я проверить это на уровне сервиса, вызвав метод реестра (existByUsername) и выдав пользовательскую ошибку, затем обнаруженную в контроллере?

Вы можете — вы можете получить некоторый отклик во время проверки кода на вопрос о том, является ли исключение правильным механизмом реализации для обработки этого. Существуют альтернативные подходы и компромиссы между ними, а также контексты (выбрасывание исключений внутри слоя или выбрасывание исключений между слоями).

Комментарии:

1. Хорошо, я понял. Спасибо за ваше мнение 🙂