2016-03-04 69 views
0

Spring總是提供非常有用的默認值來處理驗證錯誤。但有時看起來很難定製這些。在我的情況下,我有一個自定義驗證,它使用JavaScript函數來驗證域對象中的字段。默認驗證錯誤會生成4個消息代碼,它們使用對象名稱,字段名稱,字段類型和驗證類型。到現在爲止還挺好。但我想添加一個包含js函數名稱作爲組件的附加代碼。我怎麼能這樣做?Spring驗證錯誤的文檔

或者更一般的我的問題是:我在哪裏可以找到Spring構建默認錯誤消息的方式以及如何操作它們的文檔。

在我來說,我得到這樣的輸出:

{ 
    "timestamp": 1457092927829, 
    "status": 400, 
    "error": "Bad Request", 
    "exception": "org.springframework.web.bind.MethodArgumentNotValidException", 
    "errors": [ 
    { 
     "codes": [ 
     "JSValidated.order.validFrom", 
     "JSValidated.validFrom", 
     "JSValidated.java.time.ZonedDateTime", 
     "JSValidated" 
     ], 
     "arguments": [ 
     { 
      "codes": [ 
      "order.validFrom", 
      "validFrom" 
      ], 
      "arguments": null, 
      "defaultMessage": "validFrom", 
      "code": "validFrom" 
     }, 
     "checkOrder", 
     "static/OrderValidator.js" 
     ], 
     "defaultMessage": "validation checkValidFrom failed", 
     "objectName": "order", 
     "field": "validFrom", 
     "rejectedValue": 1196586930, 
     "bindingFailure": false, 
     "code": "JSValidated" 
    }, 
    { 
     "codes": [ 
     "NotEmpty.order.id", 
     "NotEmpty.id", 
     "NotEmpty.java.lang.String", 
     "NotEmpty" 
     ], 
     "arguments": [ 
     { 
      "codes": [ 
      "order.id", 
      "id" 
      ], 
      "arguments": null, 
      "defaultMessage": "id", 
      "code": "id" 
     } 
     ], 
     "defaultMessage": "may not be empty", 
     "objectName": "order", 
     "field": "id", 
     "rejectedValue": null, 
     "bindingFailure": false, 
     "code": "NotEmpty" 
    } 
    ], 
    "message": "Validation failed for object='order'. Error count: 2", 
    "path": "/order" 
} 

如何添加或更改密碼?我如何添加或更改參數列表?所有的東西都記錄在哪裏?

+0

如果這些驗證基於JSR 303註釋(即,如果使用包javax.validation中的註釋),那麼可以使用每個驗證註釋中可用的屬性message來修改默認消息。 –

+0

是的,謝謝。代碼和參數怎麼樣? – Gregor

回答

0

您可以使用全局異常處理程序使用@ExceptionHandler 您可以定義應處理哪些異常。您可以訪問拋出的異常,其中也包含驗證錯誤。 創建您自己的錯誤類,其中包含您要返回的屬性。 將驗證錯誤映射到您的錯誤對象,並將其與您選擇的HTTP狀態一起返回。 BindingException是一個例外,我從驗證變得和處理程序是這樣的:

@ExceptionHandler(BindException.class) 
@ResponseBody 
public ResponseEntity<Object> handle(HttpServletRequest req, BindException ex) {   
    ExceptionResponse response = new ExceptionResponse(ex); 
    return new ResponseEntity<>(response, HttpStatus.EXPECTATION_FAILED); 
} 

和錯誤類ExceptionResponse:

@JsonInclude(Include.NON_NULL) 
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 
public static class ExceptionResponse{ 
String exception; 
String message; 
String trace; 
public ExceptionResponse(Exception exception) { 
    super(); 
    this.exception = exception.getClass().getName(); 
    this.message = exception.getMessage(); 
    this.trace = Arrays.toString(exception.getStackTrace()); 
} 
0

這是方法getErrorAttributes的結果的JSON序列化(RequestAttributes requestAttributes , 布爾includeStackTrace)類 org.springframework.boot.autoconfigure.web.DefaultErrorAttributes

該類可以擴展以添加其他屬性。

驗證程序添加了代碼和消息,如果您想要更改它們,您需要自定義驗證程序。