我的解释可能会出错,但我认为
这主要问题为什么您无法解析验证消息密钥NotEmpty
与 Spring MessageSource 是 Spring Boot 自动配置ValidationAutoConfiguration
.
当您使用 Spring Boot 时,它会添加 org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration ,其中默认验证器组件看起来像这样:
@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();
返回默认的 Hibernateorg.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator
所以Validator
将使用默认的 HibernateResourceBundleMessageInterpolator
解析 ValidationMessages.properties 文件中的验证消息。
如果你想覆盖默认的 HibernateResourceBundleMessageInterpolator
有了自己的,你需要把@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;
}
然后验证器将使用你的LocalValidatorFactoryBean
with MessageSourceResourceBundleLocator
解析 messages.properties 文件中的验证消息。