Как получить код ошибки SQL в базе данных postgres через DataAccessException?

Я пытаюсь удалить запись из базы данных, используя jpa данных spring в базе данных postgresql, и мне нужно зафиксировать код ошибки sql.

try {
    userRepository.deleteUser(id);
} catch(org.springframework.dao.DataAccessException e) {
    // here
}

Как получить код ошибки sql в блоке catch? Метод getCause или getMessage не получает код ошибки sql

А как насчет getRootCause()? Это должно вернуть исходное исключение JDBC

a_horse_with_no_name 30.07.2019 09:23

Большое спасибо, это работает с getRootCause

Praveen Rajan 02.08.2019 04:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
878
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В официальный JavaDoc интерфейса SQLExceptionTranslator мы находим эту подсказку:

The returned DataAccessException is supposed to contain the originalSQLException as root cause. However, client code may not generally rely on this due to DataAccessExceptions possibly being caused by other resource APIs as well. That said, a getRootCause() instanceof SQLException check (and subsequent cast) is considered reliable when expecting JDBC-based access to have happened.

Итак, имея в виду эту информацию, вы можете написать такой код:

try {
    userRepository.deleteUser(id);

} catch(org.springframework.dao.DataAccessException e) {
    if ( e.getRootCause() instanceof SQLException) {
        SQLException sqlEx = (SQLException) e.getRootCause();
        int sqlErrorCode = sqlEx.getErrorCode();
        // do further things from here on...
    }
}

Надеюсь это поможет.

Большое спасибо, он отлично работает с приведенным выше кодом.

Praveen Rajan 02.08.2019 04:23

Другие вопросы по теме