Регистрация пользователя - контроллер, сервис и хранилище слоев в весенние рамки


Я пишу в настоящее время возможность регистрации и я не понимаю, как разделить логику между слоями. Вы можете просмотреть этот код и сказать, если это хороший способ сделать? В попробовать-catch блок я публикую событие, чтобы отправить проверки электронной почты для нового пользователя.

  1. Я должен сохранить в мой контроллер класса просто AuthService поле? Я использую userRepository чтобы проверить, если имя пользователя и адрес электронной почты.

  2. В AuthService Я должен держать просто authRepository и другие услуги поля? В настоящее время я использую там RoleRepository.

  3. Это возвращаемый тип в мой контроллер практиковать? ApiRespose есть два поля класса.

Контроллер:

@PostMapping("/signup")
public ResponseEntity<?> registerUser(@Valid @RequestBody SignUpRequest signUpRequest, HttpServletRequest httpServletRequest) {
    if (userRepository.existsByUsername(signUpRequest.getUsername())) {
        return new ResponseEntity(new ApiResponse(false, "Username is already in use!"), HttpStatus.BAD_REQUEST);
    }

    if (userRepository.existsByEmail(signUpRequest.getEmail())) {
        return new ResponseEntity(new ApiResponse(false, "Email is already in use!"), HttpStatus.BAD_REQUEST);
    }

    User user = new User(signUpRequest.getName(), signUpRequest.getUsername(), signUpRequest.getEmail(), signUpRequest.getPassword());

    User resultUser = authService.createUser(user);

    try {
        String host = httpServletRequest.getHeader("apphost");
        eventPublisher.publishEvent(new OnRegistrationCompleteEvent(resultUser, host));
    } catch (Exception e) {
        e.printStackTrace();
    }

    URI location = ServletUriComponentsBuilder
            .fromCurrentContextPath().path("/users/{username}")
            .buildAndExpand(resultUser.getUsername()).toUri();

    return ResponseEntity.created(location).body(new ApiResponse(true, "User registered successfully"));
}

Услуги:

@Override
public User createUser(User user) {
    user.setPassword(passwordEncoder.encode(user.getPassword()));

    Role userRole = roleRepository.findByName(RoleName.ROLE_USER)
            .orElseThrow(() -> new AppException("User Role not set."));

    user.setRoles(Collections.singleton(userRole));

    return userService.saveRegisteredUser(user);
}


241
4
задан 30 марта 2018 в 02:03 Источник Поделиться
Комментарии
1 ответ



  1. Я должен иметь в моем классе контроллера просто поле AuthService? Я использую userRepository, чтобы проверить, если имя пользователя и адрес электронной почты.


Я думаю, что это ОК, чтобы использовать UserRepository напрямую, но это дело вкуса. Вы можете создать дополнительные UserService чтобы обернуть вызовы UserRepositoryили вы могли бы также создать эти оберточные методы в AuthService.

Пример:

public class UserService/AuthService {

private UserRepository userRepository;

public boolean userExistsByUsername(String username) {
return userRepository.existsByUsername(username);
}
}

Затем вы можете использовать эти приложения UserService методов/AuthService в ваш контроллер.

Для меня, на данный момент, это выглядит как ненужная косвенности, но это классический способ разделения слоев.



  1. В AuthService я должен держать просто authRepository и другие услуги
    поля? В настоящее время я использую там RoleRepository.


Ответ на вопрос 1. Вы могли бы написать RoleService класс, который обертывает RoleRepository звонки.



  1. Это возвращаемый тип в мой контроллер практиковать? ApiRespose два-поле класса.


Я думаю, что это абсолютно нормально, потому что вы хотите установить различные коды состояния HTTP.

Другие вещи:

Код состояния HTTP

new ApiResponse(false, "Username is already in use!"), HttpStatus.BAD_REQUEST);

Просто намек, правильный код состояния HTTP для действующих лиц-409, поэтому я хотел бы использовать HttpStatus.CONFLICT. Но 400 тоже хорошо.

Обработка исключений

Этот код

Role userRole = roleRepository.findByName(RoleName.ROLE_USER)
.orElseThrow(() -> new AppException("User Role not set."));

не внутри попробовать-catch блок, так что если это исключение не обрабатывается в @Provider или некоторые @ExceptionHandlerвы можете улучшить эту часть. Если ты разбираешься в глобальном масштабе, все нормально.

1
ответ дан 2 апреля 2018 в 08:04 Источник Поделиться