Spring验证错误的文档

时间:2016-03-04 14:03:08

标签: java spring validation error-handling bean-validation

Spring总是提供非常有用的默认值来处理验证错误。但有时候看起来很难定制。在我的例子中,我有一个自定义验证,它使用javascript函数来验证域对象中的字段。默认验证错误产生4个使用对象名称,字段名称,字段类型和验证类型的消息代码。到现在为止还挺好。但我想添加一个包含js-function名称作为组件的附加代码。我怎么能这样做?

或者更一般的问题是:我在哪里可以找到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"
}

如何添加或更改代码?如何添加或更改参数列表?所有的东西都记录在哪里了?

2 个答案:

答案 0 :(得分:0)

您可以使用@ExceptionHandler使用全局异常处理程序 您可以定义应处理哪些异常。您可以访问抛出的异常,该异常还包含验证错误。 创建自己的错误类,其中包含要返回的属性。 将验证错误映射到您的错误对象中,并将其与您选择的HTTP状态一起返回。 BindingException是我从验证中获得的一个Exception,处理程序如下所示:

@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());
}

答案 1 :(得分:0)

这是方法getErrorAttributes的结果的json序列化(RequestAttributes requestAttributes,                                              类的boolean includeStackTrace)  org.springframework.boot.autoconfigure.web.DefaultErrorAttributes

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

代码和消息由验证者添加,如果您想要更改它们,则需要自定义验证器。