在spring中使用自定义验证器时,如何获取错误消息中的无效值?

在spring中使用自定义验证器时,如何获取错误消息中的无效值?,spring,spring-mvc,bean-validation,hibernate-validator,Spring,Spring Mvc,Bean Validation,Hibernate Validator,我无法在错误消息中显示无效值 我有messages.properties文件,如下所示 ProductId.exists.custom.validator.validation = A product already exists with product id ${validatedValue}. <mvc:annotation-driven validator="validator"/> <bean id="validator" class="org.springfram

我无法在错误消息中显示无效值 我有
messages.properties
文件,如下所示

ProductId.exists.custom.validator.validation = A product already exists with product id ${validatedValue}.
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource" />
</bean>
下面是我的自定义validtor接口

@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = ProductIdValidator.class)
@Documented
public @interface ProductId {
   String message() default "{ProductId.exists.custom.validator.validation}";

    Class<?>[] groups() default {};

    public abstract Class<? extends Payload>[] payload() default {};
}

我不确定我在项目中使用此解决方案的主要原因是什么——是为了使插值工作,还是仅仅使用(支持UTF-8中的属性和运行时重新加载!),而不是默认的。然而,这应该对你有用

<mvc:annotation-driven validator="validator" />

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" primary="true"
      p:messageInterpolator-ref="messageInterpolator" />

<!-- Hibernate Validator which can interpolate the value being validated in the constraint message -->
<bean id="messageInterpolator" class="ValueFormatterMessageInterpolatorFactoryBean"
      p:messageSource-ref="validatorMessageSource" />

<bean id="validatorMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
      p:basename="classpath:/config/i18n/validator-messages"
      p:defaultEncoding="utf-8"
      p:cacheSeconds="0" />

注意:我使用的是Hibernate Validator 4.3.0.Final。

您使用的是哪个版本的Bean Validation/Hibernate Validator?您在哪个环境中运行以及验证是如何触发的?嗨,Hardy,我已经更新了问题,我正在使用ibernate validator:4.3.1.Final版本。这应该真的可以工作。你知道使用的是哪一个MessageInterpolator吗?默认的是Hibernate验证器还是定制的Spring验证器?在前一种情况下,我将使用“validatedValue”的插值来工作。在后一种情况下,不会发生这种情况,因为这种插值是HV 4.3的自定义功能。您可以直接使用HV、jsut编写一个单元测试,以确保问题确实存在。在Spring 3.1和HibVal 4.3.1.Final中,我也遇到了一些噩梦。看起来HibVal无法处理resourcebundle返回与参数名同名的默认值而不是异常。这在早期版本中运行良好??
<mvc:annotation-driven validator="validator" />

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" primary="true"
      p:messageInterpolator-ref="messageInterpolator" />

<!-- Hibernate Validator which can interpolate the value being validated in the constraint message -->
<bean id="messageInterpolator" class="ValueFormatterMessageInterpolatorFactoryBean"
      p:messageSource-ref="validatorMessageSource" />

<bean id="validatorMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"
      p:basename="classpath:/config/i18n/validator-messages"
      p:defaultEncoding="utf-8"
      p:cacheSeconds="0" />
/**
 * {@linkplain FactoryBean} that creates {@link ValueFormatterMessageInterpolator}
 * with underlying {@link ResourceBundleMessageInterpolator} that uses the given
 * {@link MessageSource}.
 */
public class ValueFormatterMessageInterpolatorFactoryBean implements FactoryBean<MessageInterpolator> {

    private MessageSource messageSource;

    public MessageInterpolator getObject() throws Exception {
        ResourceBundleLocator resourceBundleLocator = new MessageSourceResourceBundleLocator(messageSource);
        return new ValueFormatterMessageInterpolator(
                new ResourceBundleMessageInterpolator(resourceBundleLocator));
    }

    public Class<?> getObjectType() {
        return ValueFormatterMessageInterpolator.class;
    }

    public boolean isSingleton() {
        return true;
    }

    @Required
    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }
}