Spring Boot 2.1.5:无法在验证消息上用字段名称替换{0}

时间:2019-06-11 01:43:53

标签: spring spring-boot thymeleaf

我正在尝试将spring-boot 2.1.4升级到2.1.5。

在spring-boot 2.1.4中,带有{0}参数的自定义验证错误消息正确替换为Field Name。 但是在spring-boot 2.1.5中,验证错误消息按原样显示{0}。

代码

  • messages.properties
notblank={0} must not be blank
  • PersonForm
import javax.validation.constraints.NotBlank;

class PersonForm {

    @NotBlank(message = "{notblank}")
    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return "Person(Name: " + this.name + ")";
    }
}

这是我的示例项目。
https://github.com/spikefin-goby/spring-boot-validation-sample

spring-boot 2.1.4结果

在spring-boot 2.1.4中,显示“名称不能为空”
(用字段名正确替换{0})
spring-boot 2.1.4 validation message

BingingResult.errors [0]是FieldError


spring-boot 2.1.5结果

但是spring-boot 2.1.5,显示“ {0}不能为空
spring-boot 2.1.5 validation message

BingingResult.errors [0]是LocalValidatorFactoryBean


对此我该怎么办?


更新

Spring Boot 2.1.6已于2019年6月19日发布。 此问题已解决!

在spring-boot 2.1.6中,显示“名称不能为空”
(用字段名正确替换{0})

2 个答案:

答案 0 :(得分:1)

在我看来,您在spring-con-5.1.7中遇到了issue #23014: validation error message {0} is not working

答案 1 :(得分:0)

您可以使用这样的异常处理程序来做到这一点:

public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex) {
    List<String> errors = new ArrayList<>();
    for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
        String error = String.format("%s.%s: %s", violation.getRootBeanClass().getSimpleName(),
                violation.getPropertyPath(), violation.getMessage());
        errors.add(error);
        logger.error(error);
    }

    ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, errors);
    return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
}

violation.getPropertyPath()返回引发违规的字段的名称。

请注意:我正在使用自己制作的类ApiError来显示错误。您不需要那样做,但重要的是,您要遍历ConstraintViolationException内部的约束违规以获取每个约束的属性路径。