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 中引入的,但如果您使用旧版本,则无论如何都应该升级。
我创建了一个自定义 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 中引入的,但如果您使用旧版本,则无论如何都应该升级。