3

如果我有一个ConstraintValidatorContext并且我正在构建一个ConstraintViolationContextBuilderusing buildConstraintViolationWithTemplate(String messageTemplate),是否有可能传递自定义参数值?

相应的属性文件看起来像这样:

Foobar.invalidValue.message=Invalid value. Valid values are {VALID_VALUES}

然后我想以编程方式设置{VALID_VALUES}.

你有什么想法?

4

2 回答 2

3

您只能在消息模板中引用相关约束注释的属性,例如,对于具有属性的约束minmax

size must be between {min} and {max}

因此,您可以将有效值指定为注释属性。

如果您使用 Hibernate Validator 作为 Bean Validation 提供程序,您可能会实现一个自定义ResourceBundleLocator,它返回带有您的值的键的包:

public class MyResourceBundleLocator implements ResourceBundleLocator {

    public ResourceBundle getResourceBundle(Locale locale) {
        //return a bundle with keys for your values, e.g. set dynamically
    }
}

然后在获取验证器时设置定位器:

Validator validator Validation.byProvider(HibernateValidator.class)
    .configure()
    .messageInterpolator(
        new ResourceBundleMessageInterpolator(
            new MyResourceBundleLocator() ) )
    .buildValidatorFactory()
    .getValidator();

或者,您可以自己格式化和准备消息并将其传递给buildConstraintViolationWithTemplate().

于 2012-11-29T23:57:21.257 回答
0

我找到了一个允许使用参数化错误消息自定义约束注释的解决方案:有关更多详细信息,请参阅此问题:javax.validation.constraints.Pattern 注释的参数化错误消息?

于 2014-09-04T19:20:38.507 回答