【问题标题】:How to map an input validation error to a specific error code in Spring如何将输入验证错误映射到 Spring 中的特定错误代码
【发布时间】:2020-06-17 10:33:51
【问题描述】:

我有一个案例,我想对端点的@RequestParams 进行一些输入验证。

我了解验证器和自定义验证器,我目前的策略是围绕 RequestParams 创建一个包装器对象,一个自定义验证器并应用类级别的注释来触发自定义验证。

我的问题是自定义验证正在实现ConstraintValidator,这意味着验证器将返回true或false,并且Spring会使用一些文本创建错误(我也知道我可以更改此文本)。然而,我的愿望是创建一个自定义有效负载返回给客户端。一个例子可以是

class MyError {
   int code;
   String message;
}

返回此对象的方法是通过 @ControllerAdvice 错误处理程序,它知道 ConstraintValidationException 应该返回我的自定义有效负载格式。但是,由于输入验证失败的不同原因,我需要返回不同的代码和消息。例如:

  • 字段为空 -> 代码 XXX
  • 字段格式不正确 -> 代码 YYY

据我所知,可以从我的@ControllerAdvice 访问的异常几乎无法自定义,我可以获得发生的错误列表,但我无法轻松确定发生了什么。 (技术上我可以,但它必须基于消息字符串,这很弱)。

有没有办法为异常提供额外的数据,以便我可以从 @ControllerAdvice 中区分发生了什么并相应地创建我的自定义错误响应?

我是不是走错了路?

【问题讨论】:

    标签: spring spring-boot validation exception


    【解决方案1】:

    您可以使用@ExceptionHandler 拦截BindException (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/BindException.html)。这包含有关所有验证错误的详细信息。例如,使用e.getFieldErrors(),您可以访问与字段相关的所有错误。

    例如,对于一个字段

    @MyConstraint
    @Length(min = 3)
    private String field;
    

    验证失败你会在异常中得到以下信息:

    • 字段data 上字段field 中的字段错误:拒绝值[XY];代码 [Length.data.field,Length.field,Length.java.lang.String,Length]。
    • 对象data 字段field 中的字段错误:拒绝值[XY];代码 [MyConstraint.data.field,MyConstraint.field,MyConstraint.java.lang.String,MyConstraint]。

    从这里你可以看到它失败了@Length约束和自定义@MyConstraint约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2019-04-05
      • 2018-09-05
      • 1970-01-01
      • 2012-12-26
      相关资源
      最近更新 更多