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

Java Spring自定义验证器-使用参数插入消息,java,spring,bean-validation,hibernate-validator,Java,Spring,Bean Validation,Hibernate Validator,我已经创建了一个自定义的ConstraintValidator,其中isValid方法如下所示: private String message; @Override public void initialize(InputValidator constraintAnnotation) { this.message = constraintAnnotation.message(); } @Override public boolean isValid(String inputValue

我已经创建了一个自定义的
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中使用时替换中的
{0}
值和
MessageSource
bean,但是HibernateConstraintValidatorContext不会替换该值

由于项目的限制,我无法更改消息格式,例如将其更改为
值${0}无效。


当前,我的应用程序显示响应“值userInput无效”。其中“userInput”是表单/对象中字段的名称。

因此
{0}
是消息参数,
${0}
是表达式变量

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