我有一个带有Controller,Model,Service和Validation类的Spring mvc应用程序。一切正常。在开发我目前拥有的东西时,我将验证消息存储在messages.properties文件中 - 我在这样的配置类中注册:
@Bean
public MessageSource messageSource() {
final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("[package name]/messages/messages");
return messageSource;
}
在Validator中,如果用户没有回答如下字段,我会添加验证消息:
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "age", "required", new Object[] {"Age"});
在messages.properties文件中我有这个(在'age'上面是模型对象的名称,'required'是用于在messages.properties文件中检索消息的密钥):
required = {0} is required.
好的,再次 - 这一切都很好。但我想做的是将消息外部化到数据库(基本上,这些是所有应用程序使用的公司消息)。
我的问题是 - 我如何让Spring使用数据库而不是messages.properties?或者我是否使用messages.properties来存储消息的id(数据库密钥)而不是消息本身?
我有几个想法,但不知道如何做任何一个。我认为Spring-form标签库最终会执行获取实际消息的工作。也许我可以以某种方式拦截那个电话?或者可能以某种方式将messageSource更改为其他内容,而不是定义messages.properties文件。
无论如何,有没有人有任何想法?
答案 0 :(得分:0)
使用自定义MessageSource实现而不是使用ResourceBundleMessageSource,该实现返回到数据库中。不幸的是,Spring本身没有这样的实现,如jira问题所述:https://jira.springsource.org/browse/SPR-364
但实现MessageSource接口非常简单,您甚至可以看到附加到jira问题的示例实现:https://jira.springsource.org/secure/attachment/10261/JdbcMessageSource.java
答案 1 :(得分:0)
您可以尝试使用Errors.rejectValue(String field, String errorCode, String defaultMessage)
方法。我也有同样的问题。就我而言,我使用了...errors.rejectValue("firstName", "error.firstName", "plz enter ur first name!!.");
理想情况下,这应该在无法从消息源中找到错误代码的场景中使用defaultMessage
。