我在Spring MVC应用程序中使用Spring Validation,它将验证委托给Hibernate Validator 5.我已经成功地验证了bean并且验证器插入了消息。但是,重要的是我还能够访问消息模板本身,预插值。
例如,在某些bean中我有验证@Size(min=5,max=15,message="{my.custom.message}"
。在messages.properties
文件中,我有条目my.custom.message=test min {min} and max {max}
。在我的BindingResult中,我看到了ObjectError,错误消息为“test min 5 and max 15”,但我需要根据非插值的my.custom.message
原始值在此时查找值。
可以这样做吗?如果它不能开箱即用,有人可以指出我如何定制spring的LocalValidatorFactoryBean以保留它吗?
更新
我正在考虑扩展org.springframework.validation.beanvalidation.SpringValidatorAdapter
,并包裹getArgumentsForConstraint
以自动将预插值的消息附加到返回的arguments
列表中。这些'论点'究竟是什么以及它们如何被使用的概念对我来说还不清楚,但如果它纯粹用于消息插值,那么我最后追加它似乎相对安全。这可能不起作用的任何原因?它可能导致的问题?更好的想法?
解决方案
除了上面的“更新”之外,没有找到任何出色的解决方案,所以我最终将LocalValidatorFactoryBean
子类化为:
@Override
protected Object[] getArgumentsForConstraint(String objectName, String field, ConstraintDescriptor<?> descriptor) {
if (null == descriptor) return super.getArgumentsForConstraint(objectName, field, descriptor);
Object[] orig = super.getArgumentsForConstraint(objectName, field, descriptor);
if (null == orig || orig.length < 1) return new Object[] { descriptor };
Object[] retval = new Object[orig.length+1];
System.arraycopy(orig, 0, retval, 0, orig.length);
retval[retval.length-1] = descriptor;
return retval;
}
在后续代码中,我查看此数组中的最后一个对象并测试它是否是ConstraintDescriptor的实例。我想是好的。
答案 0 :(得分:0)
但是,重要的是我也可以访问消息模板本身,预插值。
您需要在哪种上下文中访问模板?如果是在验证之后,则ConstraintViolation上的getMessageTemplate()
会为您提供此信息。如果它在约束验证器实现中,那么您可以在ConstraintValidatorContext上使用getDefaultConstraintMessageTemplate()
。