我通常做的是創建一個ValidationError
模型。在發生驗證錯誤的情況下,該模型以JSON的形式返回給客戶端,同時還包含HTTP狀態代碼,並且它包含客戶端需要了解的錯誤的所有信息。
模型的細節有所不同,但像這樣將是一個良好的開端:
public class ValidationError {
private int code;
private String message;
private Map<String, String> fields;
/*...*/
}
現在,當一個無效的表單提交,JSON響應將是這樣的:
{
"code": 400,
"message": "invalid form value(s)",
"fields": {
"username": "the username already exists",
"password": "password must be more than 6 characters"
}
}
這與Spring的@ExceptionHandler
很好地結合在一起。當你得到的東西像一個BindException
,所有你需要做的是:
@ExceptionHandler(BindException.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
private ValidationError handleBindException(BindException ex) {
ValidationError validationError = new ValidationError();
/* set code and message */
for (FieldError error : ex.getFieldErrors()) {
/* set fields' errors */
}
return validationError;
}
BindException
可以很容易地獲得字段的錯誤。需要更多的工作來挖掘異常中的錯誤,如JsonMappingException
。
您必須使用HTTP狀態碼和消息(也稱爲自我描述消息約束),並且可以在主體中以更具體的方式描述錯誤,例如,與多語言錯誤消息和自定義錯誤代碼。請注意,錯誤消息發送給最終用戶,他們不關心確切的異常類型等等。您可以通過調試模式向開發人員發送擴展錯誤消息。 – inf3rno 2014-11-03 22:18:28
我在問關於錯誤機構的模型:)現在我看到了2個分類 - 字段中的錯誤,邏輯錯誤,基本上我問的是什麼是一個更大的圖片,除了字段錯誤和全局錯誤之外什麼是丟失。 – mavarazy 2014-11-04 05:35:37
我認爲缺少一個標準來解耦客戶端與服務的實現。 [Hydra](http://www.markus-lanthaler.com/hydra/spec/latest/core/)確實有一個。我不知道其他錯誤類型,如果你問。通過字段錯誤,你顯然必須使用一些CompositeException,一般的錯誤你必須使用一個簡單的Exception。之後,你必須將其轉換成json,xml等......就這些了。我不認爲這很難。 – inf3rno 2014-11-04 12:27:41