问题
I am using Spring to display messages from a properties file. I would like to be able to override the <spring:message>
tag to use a value from a database based on the logged in user. If this value is not present I would like it to default to the value currently in the properties file as it does now.
Can someone help me with this code? I've read about AbstractMessageSource but I am unclear on how to implement it.
Thanks
回答1:
You have to implement custom message source. It's a class that extends AbstractMessageSource
and implements the abstract resolveCode(java.lang.String, java.util.Locale)
method. There is almost same question on SO (it's solution for Grails), but I think it is good point to start from...
Take a look at those threads in Spring forums:
- AbstractMessageSource using DB table instead of props file?
- i18n and the database
- database-backed resourcebundle for i18n and dynamically adding new langs
- Database Driven Resource Bundles - Examples and best practice?
回答2:
I ended up creating a class called DatabaseMessageSource included below. I still need to implement some kind of caching so I don't hit the database with each call. This link was helpful too. Thank you skaffman and PrimosK for pointing me in the right direction.
public class DatabaseMessageSource extends ReloadableResourceBundleMessageSource {
@Autowired
private MyDao myDao;
protected MessageFormat resolveCode(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
MessageFormat format;
if (myObj!= null && myObj.getId() != null) {
format = new MessageFormat(myObj.getValue(), locale);
} else {
format = super.resolveCode(code, locale);
}
return format;
}
protected String resolveCodeWithoutArguments(String code, Locale locale) {
MyObj myObj = myDao.findByCode(code);
String format;
if (myObj != null && myObj.getId() != null) {
format = myObj.getValue();
} else {
format = super.resolveCodeWithoutArguments(code, locale);
}
return format;
}
}
I updated my applicationContext to point to the newly created class. I changed it to:
<bean id="messageSource" class="com.mycompany.mypackage.DatabaseMessageSource">
<property name="basenames">
<list>
<value>classpath:defaultMessages</value>
</list>
</property>
<property name="defaultEncoding" value="UTF-8"/>
</bean>`enter code here`
回答3:
You don't need to change the behaviour of <spring:message>
, you just need to change the place it gets its messages from.
By default, it uses the messageSource
bean in the context, which is of type MessageSource
, or some subclass thereof. You can write your own class that implements MessageSource
and add that to your context as the messageSource
bean.
AbstractMessageSource
is just a convenient starting point for writing your own MessageSource
. It does some of the work for you, just subclass it.
来源:https://stackoverflow.com/questions/10623388/override-springmessage-tag-with-database-values