2016-03-04 126 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

该类可以扩展以添加其他属性。

验证程序添加了代码和消息,如果您想要更改它们,您需要自定义验证程序。