【问题标题】:Spring Validation - How to retrieve errors.rejectValue in my Contoller?Spring Validation - 如何在我的控制器中检索 errors.rejectValue?
【发布时间】:2017-06-26 08:35:39
【问题描述】:

我的 TestValidator 中有如下验证方法

@Override
public void validate(Object target, Errors errors) {
    Test test = (Test) target;
    String testTitle = test.getTestTitle();

    //**ErrorCheck1** - This works, and I am able to pull the value in my controller
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "testTitle", "test.testTitle.projec", "My msg");


    if (testTitle != null && testTitle.length() < 4) {
        logger.error("Inside custom validation"+test.testTitle().length());

        //**Error Check2**
        //***HOW DO I RETRIEVE THE BELOW VALUE in My controller
        errors.rejectValue(testTitle, "test.testTitle.lessThen4");
        errors.addAllErrors(errors);
        logger.error("Entered If condition of validate");
    }
}

我的控制器是

@RequestMapping(value = "/test", method = RequestMethod.PUT)
public ResponseEntity<BasicResponseDTO> newTest(@Valid  @RequestBody Test test, BindingResult result) {

    if (result.hasErrors()){
        logger.error("Entered Errors");
        BasicResponseDTO basicResponseDTO = new BasicResponseDTO();
        basicResponseDTO.setCode(ResponseCode.BAD_REQUEST);
        return new ResponseEntity<BasicResponseDTO>(basicResponseDTO, HttpStatus.BAD_REQUEST);
    }
}

当我的 ErrorCheck1 条件被激活时,我在控制器内的 IF 条件能够检索它。 但是,在我的 ErrorCheck2 中,由于 errors.rejectValue 的原因,我立即在控制台上收到错误消息,并且无法优雅地处理 testTitle 长度小于 4 的情况。

errors.rejectValue 的替代方法是什么,以便我可以处理 我的控制器出错了?

【问题讨论】:

  • 什么是ErrorCheck1和ErrorCheck12?
  • 请查看第 5 行和第 9 行代码的注释部分。我已将它们标记为 ** 以使其清楚。

标签: java spring validation spring-boot spring-data


【解决方案1】:

好的 - 知道了。我所要做的就是改变

errors.rejectValue(testTitle, "test.testTitle.lessThen4");

errors.reject(testTitle, "test.testTitle.lessThen4");

RejectValue 是一个字段错误,本质上不是全局的。 Reject 是一个全局错误,可以从控制器的错误列表中访问。

来自文档

void reject(String errorCode, String defaultMessage);
使用给定的错误描述为整个目标对象注册一个全局错误。

@Override
public void validate(Object target, Errors errors) {
Test test = (Test) target;
String testTitle = test.getTestTitle();

//**ErrorCheck1** - This works, and I am able to pull the value in my controller
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "testTitle", "test.testTitle.projec", "My msg");


if (testTitle != null && testTitle.length() < 4) {
    logger.error("Inside custom validation"+test.testTitle().length());

    //**Error Check2**
    //***HOW DO I RETRIEVE THE BELOW VALUE in My controller
    errors.reject(testTitle, "test.testTitle.lessThen4");
    errors.addAllErrors(errors);
    logger.error("Entered If condition of validate");
   }
}

希望对某人有所帮助。

【讨论】:

    【解决方案2】:

    您不能直接访问该值,但有一种方法可以将该值包含到错误消息中

    ${validatedValue}
    

    如果你这样注释一个字段

    @Size(min = 10, message =”Phone number entered [${validatedValue}] is invalid. It must have at least {min} digits”)
    private String phoneNumber;
    

    然后输入123你的错误信息应该是

    Phone number entered [123] is invalid. It must have at least 10 digits. Thus you can access the value.
    

    https://raymondhlee.wordpress.com/2014/07/26/including-field-value-in-validation-message-using-spring-validation-framework-for-jsr-303/

    【讨论】:

    • 由于我使用的是 Rest,我想捕获错误事件并将适当的响应发送回我的前端。必须有一种方法,否则我认为自定义错误消息的 Spring Validators 的整个概念不够强大。谢谢。
    • 如果您将值本身存储在错误列表中,您可以交互 result.errors 并找到添加的错误。并从错误中返回信息。
    • 是的。如您所描述的,如何在没有类注释的情况下将值存储在错误列表中?我想过做errors.addAllErrors(errors);但不确定这是否可行...
    • 您在代码中将错误添加到所有错误列表中。
    • 很抱歉,把你弄丢了。你可以编辑你的答案吗?谢谢。
    猜你喜欢
    • 2020-08-22
    • 2015-11-19
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多