【问题标题】:Documentation of Spring Validation ErrorsSpring 验证错误的文档
【发布时间】:2016-06-18 07:18:04
【问题描述】:

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"
}

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

【问题讨论】:

  • 如果这些验证基于 JSR 303 注释(即,如果您使用包 javax.validation 中的注释),那么您可以使用每个验证注释上可用的属性 message 修改默认消息.
  • 好的,谢谢。代码和参数呢?

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


【解决方案1】:

您可以使用@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());
}

【讨论】:

    【解决方案2】:

    这是方法getErrorAttributes(RequestAttributes requestAttributes, 类的布尔值 includeStackTrace) org.springframework.boot.autoconfigure.web.DefaultErrorAttributes.

    这个类可以扩展来添加额外的属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多