我正在创建一个简单的Spring REST应用程序,以下是我的spring配置类;
@Configuration
@EnableWebMvc
@ComponentScan( basePackages = "com.example.spring" )
public class AppConfig {
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
return messageSource;
}
}
这就是我在控制器类中所做的事情;
@RequestMapping(value = "/create", method = RequestMethod.POST)
public ResponseEntity<Map<String, String>> createEmployee(@Valid @RequestBody EmployeeModel employeeModel, BindingResult result) {
if (result.hasErrors()) {
System.out.println("Errors: " + result.getAllErrors());
Map<String, String> response = new HashMap<>();
response.put("status", "failure");
return new ResponseEntity<>(response, HttpStatus.OK);
}
employeeService.createEmployee(employeeModel);
Map<String, String> response = new HashMap<>();
response.put("status", "success");
return new ResponseEntity<>(response, HttpStatus.OK);
}
我在EmployeeModel中注释了我的名字字段,如下所示;
@NotEmpty
@Column(name = "name")
private String name;
这是我的messages.properties文件,位于src / main / resources文件夹中。
NotEmpty.employeeModel.name = Employee name is required.
但我无法阅读此错误消息我只收到@NotEmpty的默认消息。
我甚至尝试过以下配置;
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
return messageSource;
}
请帮助我!
答案 0 :(得分:1)
好吧,也许有点晚了,但这绝对适合我。
尝试更改此 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;
}
您的 LocalValidatorFactoryBean
应与您已定义的相同。
@Bean
public LocalValidatorFactoryBean validator() {
final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource());
return localValidatorFactoryBean;
}
我使用Spring 5.0.1.Final
和Hibernate Validator 5.4.2.Final
版本进行了测试。
答案 1 :(得分:0)
您需要告诉validator
使用messageSource
。
@Bean
public javax.validation.Validator validator() {
final LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean();
factory.setValidationMessageSource(messageSource());
return factory;
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
return messageSource;
}
并在模型上指定消息键:
@NotEmpty(message = "{NotEmpty.employeeModel.name}")
private String name;
答案 2 :(得分:0)
旧问题,但这对我有用:
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean(final MessageSource messageSource) {
final LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
localValidatorFactoryBean.setValidationMessageSource(messageSource);
return localValidatorFactoryBean;
}
答案 3 :(得分:0)
在做完所有正确的事后,应用在上提到的所有修复程序 堆栈溢出并花费数小时只是为了使其正常工作,我终于能够通过在我的messages.properties文件中添加以下内容来对其进行修复
"# suppress inspection "UnusedProperty" for whole file"
请注意,我使用的是intellij,出于某种奇怪的原因,它没有阅读我的消息。
答案 4 :(得分:-1)
如果仍然打开可能会有帮助。 对于类似的情况感到困惑,我通过明确使用Interpolator来解决它:
<!-- Messagesource for locales -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<util:list>
<value>classpath:locales/messages/validation</value>
</util:list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
<bean id="resourceBundleMessageInterpolator"
class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator">
<constructor-arg index="0">
<bean class="org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator">
<constructor-arg index="0" ref="messageSource"/>
</bean>
</constructor-arg>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="messageInterpolator" ref="resourceBundleMessageInterpolator"/>
</bean>
<mvc:annotation-driven validator="validator" />
与相反,在其他线程中也建议通过以下方式给出自动注入:
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
通过以上方法,我设法通过使用括号在验证属性文件中使用占位符:即:
@NotNull(message = "{message.notnull}")
以下线程提示对我来说也是必须的:
Why Spring Message Interpolation Argument Replacement using Hibernate Validator don't work? How to use annotation validation in Spring with error message gotten from properties file?