2012-11-29 41 views
3

如果我有ConstraintValidatorContext,并且我正在使用buildConstraintViolationWithTemplate(String messageTemplate)构建ConstraintViolationContextBuilder,是否有任何可能性来传递自定义参数值?JSR 303/ConstraintValidatorContext:参数化错误消息

相应的属性文件看起来在某种程度上是这样的:

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

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

你有什么想法吗?

回答

3

您只能在消息模板中引用相关约束注释的属性,例如,像这样与属性minmax约束:

size must be between {min} and {max} 

所以,你可以作为注解属性指定有效值。

如果你使用Hibernate验证作为Bean验证提供者,你可能实现自定义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()

+0

非常感谢您对这个解释广泛:)! – parkerlewis