2011-08-18 46 views
4

在我的應用程序中,當引發違規密鑰時,我想獲取約束名稱,但我找不到任何方法來獲取此信息。由「getMessage()」返回的消息是非常概括的,我需要有關錯誤的更多信息才能向最終用戶發出可定製的錯誤消息。如何獲取org.springframework.dao.DataIntegrityViolationException中的約束名稱?

堆棧跟蹤:

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] 

感謝。

亞瑟

回答

2

包裝異常通常有一種方法來嵌套它們中的原始異常。對於Hibernate,你的ConstraintViolationException是一個JDBCException,它有一個名爲getSQLException的方法,它返回實際的異常。因此,在Spring DataIntegrityViolationException(爲了獲得Hibernate異常)上調用getCause,調用getSQLException,最後在SQLException上調用getMessage()。該消息應該與Hibernate JDBCExceptionReporter記錄的內容相同,如果只需要約束名稱,則必須解析該字符串。

3

插入catch聲明是這樣的:

catch (DataIntegrityViolationException e) { 
     String message = e.getMostSpecificCause().getMessage(); 
} 
+1

這將在格式返回一個字符串'錯誤:重複鍵值違反唯一約束「uk_meb3tm159kt0clyot5mmv8oht」 詳細信息:按鍵(ORGANIZATION_NAME)=(別墅學院QI校園)已經存在。如果他們想爲最終用戶提供消息,這將不會有幫助 –