在SpringMVC中访问预插入的bean验证消息模板?

时间:2013-11-25 05:11:16

标签: spring validation spring-mvc bean-validation

我在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的实例。我想是好的。

1 个答案:

答案 0 :(得分:0)

  

但是,重要的是我也可以访问消息模板本身,预插值。

您需要在哪种上下文中访问模板?如果是在验证之后,则ConstraintViolation上的getMessageTemplate()会为您提供此信息。如果它在约束验证器实现中,那么您可以在ConstraintValidatorContext上使用getDefaultConstraintMessageTemplate()