Отловить исключение при сохранении сущности, CrudRepository Spring

140
08 мая 2022, 20:40

Пытаюсь отловить исключение при попытке дублирования полей во время сохранения пользователя (на поле ограничение UNIQUE). Использую save от CrudRepository, в документации следующее описание метода:

Returns: the saved entity; will never be null.
Throws: IllegalArgumentException - in case the given entity is null.

Но что если ошибка будет при выполнении запроса?

Контроллер:

@PostMapping(value = "/api/users/save")
public ResponseEntity save(@Valid @RequestBody User user) {
    User newUser = userService.save(user);
    log.info(newUser);
    return ResponseEntity.ok(newUser);
}

Сервис:

@Override
public User save(User user) {
    user.setId(userRepository.getLastId());
    user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
    User newUser = null;
    try {
        newUser = userRepository.save(user); // никаких исключений
    } catch (Exception e) {
        log.error("CATCH STATEMENTS");
    } finally {
        log.info("FINALLY STATEMENTS");
    }
    return newUser;
}

Но при попытке сохранить пользователя я получаю ошибку:

ERROR 16228 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : ORA-00001: нарушено ограничение уникальности (STORM.USERS_EMAIL_UINDEX) 
java.sql.SQLIntegrityConstraintViolationException: ORA-00001: нарушено ограничение уникальности (STORM.USERS_EMAIL_UINDEX)

Сервис возвращает мне пользователя при выполнении save, а при передаче запроса (?) выбрасывает ошибку. Где отловить исключение я уже отчаялась найти.

Кстати, еще я пробовала проверять статус ответа в фильтре, но до фильтра выполнение просто не доходит. Возможно у вас есть идеи, где бы я смогла отловить исключение, спасибо.

#UPDATED

При попытке отловить RuntimeException или DataIntegrityViolationException суть не меняется (

log.warn("Try to save user");
try {
    return userRepository.save(user);
} catch (RuntimeException e) {
    log.error("Failed to save user");
}

И вот результат:

Answer 1

Вы не можете отловить, потому что там RuntimeException нужно ловить, а если конкретней, то DataIntegrityViolationException. Почитать можно например тут

READ ALSO
как записать целую команду в 1 букву c++

как записать целую команду в 1 букву c++

мне надоедает и иногда лень писать команду (cout << "текст";) поэтому хочу поместить всю строку cout << "текст"; в букву c

218
Вылет приложения Attempt to invoke virtual method &#39;void android.widget.TextView.setText(java.lang.CharSequence)&#39;

Вылет приложения Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)'

Суть программы заключается во вставлении текста в поля через нажатие кнопки возле поляТекст для вставление берется с EditText сверху

157