java - Spring 验证错误的文档

标签 java spring validation error-handling bean-validation

Spring 始终提供非常有用的默认值来处理验证错误。但有时定制这些看起来很困难。就我而言,我有一个自定义验证,它使用 JavaScript 函数来验证域对象中的字段。默认验证错误会生成 4 个消息代码,分别使用对象名称、字段名称、字段类型和验证类型。到目前为止,一切都很好。但我想添加一个额外的代码,其中包含 js 函数的名称作为组件。我怎样才能做到这一点?

或更笼统地说,我的问题是:在哪里可以找到有关 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"
}

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

最佳答案

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

关于java - Spring 验证错误的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798015/

相关文章:

java - 使用 GlassFish 部署 Java 应用程序时出错

java - 使用 thymeleaf 将参数传递给 spring Controller

java - 如何检查用户输入的日期是否大于java中当前日期的32天

java - 使用一个 Controller 播放/暂停多个 MediaView JavaFX FXML

java - Java 6 中 if/or 与 try/catch 的复合成本

java - HttpResponse 使用 android 问题 : execute always causes exception?

java - Eclipse 中的 Spring 可视化 - UML 图等 - 开源

Spring Security 5 OAuth2 客户端密码授予类型

regex - Laravel 验证小数 0-99.99

angularjs - 手动输入和导入输入的 Angular 形式验证