Как получить имя ограничения в org.springframework.dao.DataIntegrityViolationException? - PullRequest
7 голосов
/ 18 августа 2011

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

Трассировка стека:

84732 [http-8080-1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 23505
84732 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter  - ERROR: duplicate key value violates unique constraint "ix_tb_oferta_vaga"
  Detalhe: Key (cd_pj, cd_curso)=(680, 29) already exists.
187405 [http-8080-1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: 23505
187405 [http-8080-1] ERROR org.hibernate.util.JDBCExceptionReporter  - ERROR: duplicate key value violates unique constraint "ix_tb_oferta_vaga"
  Detalhe: Key (cd_pj, cd_curso)=(680, 29) already exists.

getMessage ():

could not insert: [br.gov.ce.seduc.estagio.model.bean.OfertaVaga]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [br.gov.ce.seduc.estagio.model.bean.OfertaVaga]

Спасибо.

Arthur

Ответы [ 2 ]

7 голосов
/ 18 августа 2016

Вставьте оператор catch, например:

catch (DataIntegrityViolationException e) {
        String message = e.getMostSpecificCause().getMessage();
}
3 голосов
/ 18 августа 2011

Исключения обертки обычно имеют способ вложить оригинальное исключение в них. Для Hibernate ваше ConstraintViolationException является JDBCException, у него есть метод с именем getSQLException , который возвращает фактическое исключение. Поэтому вызовите getCause для Spring DataIntegrityViolationException (чтобы получить исключение Hibernate), вызовите getSQLException для этого и, наконец, вызовите getMessage () для SQLException. Сообщение должно совпадать с тем, что вы видите в журнале Hibernate JDBCExceptionReporter, если вам нужно только имя ограничения, вам придется проанализировать строку.

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