2015-11-28 73 views
2

考慮具有屬性namePerson實體,其註釋爲@NotNull。然後一個簡單的PersonRepository和這個回購暴露與春天數據休息。Spring數據REST Bean驗證

當我POST創建一個新的Person,如果name屬性是null一個ValidationException預期發生。但是我實際上在客戶端上得到的是內部服務器錯誤(500),並且消息是在異常鏈中發生很多晚些時候發生的TransactionSystemException

我會期望得到的是一個壞請求(400)與實際ValidationException和它的所有有用的信息,以便客戶能知道什麼是錯的發佈數據。

似乎有一種方法可以將自定義驗證器與SDR相關聯,如here所述。但問題是,這不是一個自定義的驗證器,它是在存儲庫被要求保存數據時發生的標準的bean驗證。所以我不確定這兩者是如何結合在一起的。

所以問題:

  1. 我有哪些選擇,讓客戶知道使用SDR時,有什麼不對所提交的數據?像什麼領域是無效的,什麼是每個領域的錯誤將是真棒。
  2. 有沒有關於這個地方的任何例子?

非常感謝。

回答

0

您需要的是一個合適的ExceptionHandler,它將處理後端異常並向前端客戶端發送有意義的豐富消息(json/xml)。

看看一個這個git repository

+0

這看起來像解決我的問題,正確的方法,以及相關的LIB是真棒。只是一件事,如果我可能會濫用這個問題。在我的具體情況下,我的異常鏈看起來像這樣:'ConstraintViolationException' - >'RollbackException' - >'TransactionSystemException'。我想定位'ConstraintViolationException',而不是其他的。那麼Spring會考慮哪個異常:鏈中的異常或最後一個異常? – user1387786

+0

@ user1387786當然你的目標是鏈中的最後一個異常,在春天數據會是'DataIntegrityViolationException',或者如果你直接使用hibernate,它會是'ConstraintViolationException' –

+0

看起來像這在SDR上不起作用,因爲例外被包裝。 https://github.com/jirutka/spring-rest-exception-handler/issues/5。 – user1387786