我正在使用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文件中处理此消息密钥。
我知道在堆栈溢出中已经存在一些与此相关的问题,但这些解决方案并没有解决我的问题。我无法在这里找出我做错了什么。
答案 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;
}
然后,验证程序将LocalValidatorFactoryBean
与MessageSourceResourceBundleLocator
一起使用来解析messages.propeties文件中的验证消息。
答案 2 :(得分:0)
我遇到了同样的问题。但我现在解决了。 我的方法很简单。
@EnableWebMvc
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport
祝你好运。