2

我正在开发 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(路径: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 时,它都会显示它的键而不是它的值。Hibernate 验证器默认搜索消息键在里面ValidationMessages.properties所以每当我添加ValidationMessages.properties文件时添加消息这个键值然后它对我来说工作正常。

但我不想添加 ValidationMessage.properties 文件,而不是这个我想在我的 message.properties 文件中处理这个消息键。

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

4

3 回答 3

2

我可能会误认为是 explonation,但我认为您无法使用 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将使用默认的 HibernateResourceBundleMessageInterpolator来解析 ValidationMessages.properties 文件中的验证消息。

如果你想ResourceBundleMessageInterpolator用自己的覆盖默认的 Hibernate,你需要把@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;
}

然后 Validator 将使用您的LocalValidatorFactoryBeanwithMessageSourceResourceBundleLocator来解析 messages.propeties 文件中的验证消息。

于 2019-06-10T20:16:55.000 回答
0

我有同样的问题。但我现在已经解决了。我的方法很简单。

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

祝你好运。

于 2019-06-25T14:14:41.703 回答
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文件中

于 2017-10-07T15:34:21.013 回答