Java выбрасывает неправильное исключение - PullRequest
0 голосов
/ 07 июня 2019

Я создал 2 пользовательских исключения для обработки создания и сохранения новых пользователей в БД.Электронная почта (имя пользователя) является уникальным идентификатором, поэтому, если электронная почта дублируется, следует создать исключение, так как уникальный идентификатор уже существует.Я также делаю совпадение с подтверждением пароля.Это подтверждение совпадения также приведет к пользовательскому исключению паролей, которые не совпадают.Эти 2 части работают правильно независимо друг от друга, однако, когда я собираю все вместе и проверяю, если подтверждение пароля не удается, его выдача имя пользователя уже существует исключение, а пароли не совпадают с исключением.Зачем?

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

        //Username(email) must be unique
        try {
            //password and confirm password must match
            if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
                throw new PasswordMatchException("password and confirm password does not match");
            } 
                //if passwords match - persist to DB
                newGcUser.setPassword(bCryptPasswordEncoder.encode(newGcUser.getPassword()));
                //Do NOT persist or show the confirm Password
                newGcUser.setConfirmPassword("");
                //set user
                newGcUser.setName(newGcUser.getUsername());
                return userRepository.save(newGcUser);

        } catch (Exception e) {
            throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
        }

    } 

Я использую Почтальон для тестирования.Если я проверяю письмо, которое, как мне известно, не зарегистрировано, и не совпадает с паролями, вместо PasswordMatchException появляется сообщение UsernameAlreadyExistsException

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Это происходит потому, что ваш блок try {} catch (Exception e) {} перехватывает исключение, которое вы бросаете в блоке, выбросьте исключение за пределы блока try catch, и оно должно работать catch:

    // password and confirm password must match
    if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
        throw new PasswordMatchException("password and confirm password does not match");
    }

    // Username(email) must be unique
    try {
        // if passwords match - persist to DB
        newGcUser.setPassword(bCryptPasswordEncoder.encode(newGcUser.getPassword()));
        // Do NOT persist or show the confirm Password
        newGcUser.setConfirmPassword("");
        // set user
        newGcUser.setName(newGcUser.getUsername());
        return userRepository.save(newGcUser);

    } catch (Exception e) {
        throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
    }

(или перехватить менее универсальное исключение, например, исключение, которое выбрасывается из userRepository.save, и повторно выбросить его, тогда оно будет перехватывать только это исключение, а не все)

0 голосов
/ 07 июня 2019

Посоветуйте разбить на разные методы и сделать его модульным:

private void matchPassword(..newGcUser..) throws PasswordMatchException{
// password and confirm password must match
    if (!newGcUser.getPassword().equals(newGcUser.getConfirmPassword())) {
        throw new PasswordMatchException("password and confirm password does not match");
    }
}

Метод для сохранения должен поймать конкретное исключение:

// Username(email) must be unique
try {
    // if passwords match - persist to DB
   ...
    return userRepository.save(newGcUser);

} catch (DataIntegrityViolationException e) {
    throw new UsernameAlreadyExistsException("Username: '" + newGcUser.getUsername() + "' already exists.");
}
0 голосов
/ 07 июня 2019

Это происходит потому, что ваш PasswordMatchException расширяет Exception, а ваш блок catch ловит его и выбрасывает UsernameAlreadyExistsException.

Сокращение вашего кода, чтобы проиллюстрировать мою точку зрения:

try {
     throw new PasswordMatchException();
} catch(Exception e) {
     throw new UsernameAlreadyExistsException();
}

Не зная больше о том, какие исключения может генерировать ваш код, у вас, вероятно, есть два решения:

1) Поймать что-то более конкретное, чем Exception.

2) Переместите проверку пароля за пределы блока try / catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...