Spring 自定义验证器 - 使用参数插入消息

Spring Custom Validator - Interpolate message with parameter

我创建了一个自定义 ConstraintValidator,其中 isValid 方法如下所示:

private String message;

@Override
public void initialize(InputValidator constraintAnnotation) {
    this.message = constraintAnnotation.message();
}

@Override
public boolean isValid(String inputValue, ConstraintValidatorContext context) {
    HibernateConstraintValidatorContext h = context.unwrap(HibernateConstraintValidatorContext.class);
    h.disableDefaultConstraintViolation();

    //logic goes here

    if(!valid) {
        h.addExpressionVariable("0", inputValue);
        h.buildConstraintViolationWithTemplate(this.message)
            .addConstraintViolation();
    }
    return valid;
}

我在messages.properties中还有以下内容:

error.input=The value {0} is invalid.

我可以使用上面的消息并在 thymeleaf 和 MessageSource bean 中使用它时替换其中的 {0} 值,但是 HibernateConstraintValidatorContext 不会替换该值。

鉴于我的项目的限制,我无法更改消息格式,例如将其更改为 The value [=18=] is invalid..

我目前有显示响应 "The value userInput is invalid." 的应用程序,其中 "userInput" 是 form/object 中字段的名称。

所以{0}是一个消息参数,而[=11=]是一个表达式变量。

您必须使用 #addMessageParameter() 而不是 #addExpressionVariable()。它是在 Hibernate Validator 5.4.1 中引入的,但如果您使用旧版本,则无论如何都应该升级。