我正在尝试将spring-boot 2.1.4升级到2.1.5。
在spring-boot 2.1.4中,带有{0}参数的自定义验证错误消息正确替换为Field Name。 但是在spring-boot 2.1.5中,验证错误消息按原样显示{0}。
notblank={0} must not be blank
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中,显示“名称不能为空”
(用字段名正确替换{0})
spring-boot 2.1.4 validation message
BingingResult.errors [0]是FieldError
类
但是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})
答案 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
内部的约束违规以获取每个约束的属性路径。