Hibernate验证器中的自定义消息密钥无法与message.property

时间:2017-04-28 06:58:40

标签: spring spring-mvc spring-boot hibernate-validator jsr330

我正在使用Spring Boot,我使用了Hibernate Validator来验证我的bean。我添加了一个带有@NotEmpty注释的自定义键,并在message.properties中添加了键/值对,但它没有从message.property获取其值

这是我的带有验证注释的bean:

public class CategoryBean {
    @NotEmpty(message = "{category.name.notempty}")
    private String name;
    ----getter setter-----
}

message.properties(path:src / main / resources / message.properties)

category.name.notempty=Sorry! Category can't be empty

我还配置了消息资源

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("message");
    return messageSource;
}

我还配置了LocalValidatorFactoryBean

@Bean
public LocalValidatorFactoryBean validator() {
    final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
    localValidatorFactoryBean.setValidationMessageSource(messageSource());
    return localValidatorFactoryBean;
}

每当我验证这个bean时,它都会显示其键而不是它的值。 ValidationMessages.properties内的Hibernate验证器默认搜索消息密钥,所以每当我添加ValidationMessages.properties文件时,都会添加消息此密钥值,然后它对我来说运行正常。

但我不想添加ValidationMessage.properties文件,而不是我想在message.properties文件中处理此消息密钥。

我知道在堆栈溢出中已经存在一些与此相关的问题,但这些解决方案并没有解决我的问题。我无法在这里找出我做错了什么。

3 个答案:

答案 0 :(得分:0)

试试这个,用这个替换你的MessageSource:

@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:/messages");
    messageSource.setUseCodeAsDefaultMessage(false);
    messageSource.setCacheSeconds((int) TimeUnit.HOURS.toSeconds(1));
    messageSource.setFallbackToSystemLocale(false);
    return messageSource;
}

您必须将邮件category.name.notempty=Sorry! Category can't be empty放在resources/messages.properties文件

答案 1 :(得分:0)

我可能会误解,但是我认为 主要问题,为什么您无法使用Spring MessageSource解决NotEmpty的验证消息密钥是Spring Boot自动配置ValidationAutoConfiguration

使用Spring Boot时,它会添加org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,其中 defaultValidator 组件如下所示:

@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@ConditionalOnMissingBean(Validator.class)
public static LocalValidatorFactoryBean defaultValidator() {
    LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
    MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory();
    factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
    return factoryBean;
}

您可以看到此factoryBean使用包含代码的getObject()方法从MessageInterpolatorFactory设置MessageInterpolator:

return Validation.byDefaultProvider().configure()
                .getDefaultMessageInterpolator();

返回默认的休眠org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator

因此,Validator将使用默认的休眠ResourceBundleMessageInterpolator来解析ValidationMessages.properties文件中的验证消息。

如果您要使用自己的名称覆盖默认的休眠ResourceBundleMessageInterpolator,则需要将@Primary放到LocalValidatorFactoryBean中:

@Bean
public MessageSource messageSource() {
    final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:messages");
    return messageSource;
}

@Bean
@Primary
public LocalValidatorFactoryBean validatorBean(MessageSource messageSource) {
    final LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource);
    return bean;
}

然后,验证程序将LocalValidatorFactoryBeanMessageSourceResourceBundleLocator一起使用来解析messages.propeties文件中的验证消息。

答案 2 :(得分:0)

我遇到了同样的问题。但我现在解决了。 我的方法很简单。

  1. 请勿使用@EnableWebMvc
  2. 请勿扩展org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport

祝你好运。