Spring中数据库驱动的资源包 [英] Database-driven resource bundle in Spring
问题描述
我无法使数据库驱动的资源束"正常工作.在下面的示例中,在应用程序启动期间正确插入了TextDAO
,但是当访问messageSource
时,将创建一个新的Messages
对象-就是这一点.如何进行这项工作?
I have problem to make "database-driven resource bundle" work. In example below TextDAO
is properly injected during application start, but when messageSource
is accessed, a new Messages
object is created - that's the point. How to make this work ?
<!-- message source -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="someapp.bundle.Messages" />
</bean>
Messages.java
@Component
public class Messages extends ListResourceBundle {
@Autowired
private TextDAO textDAO;
public Messages() {
log.debug("CONSTRUCTOR");
}
@Override
protected Object[][] getContents() {
// loading messages from DB
List<Text> texts = textDAO.findAll(); // textDAO is null
...
}
}
重新打开
如Bozho
所示,我按如下所示进行了资源捆绑,但是在动态重新加载它时遇到了问题.我想ReloadableResourceBundleMessageSource是用于属性文件的,但是也许也可以使用它.
RE-OPEN
As Bozho
suggest i did my resource bundle as below, but have problem to dynamically reload it. I suppose that ReloadableResourceBundleMessageSource is for properties files, but maybe it is possible to work this, too.
public class DatabaseDrivenMessageSource extends ReloadableResourceBundleMessageSource {
private Logger log = LoggerFactory.getLogger(getClass());
private final Map<String, Map<String, String>> properties = new HashMap<String, Map<String, String>>();
private TextDAO textDAO;
@Autowired
public DatabaseDrivenMessageSource(TextDAO textDAO) {
this.textDAO = textDAO;
reload();
}
@Override
protected MessageFormat resolveCode(String code, Locale locale) {
String msg = getText(code, locale);
MessageFormat result = createMessageFormat(msg, locale);
return result;
}
@Override
protected String resolveCodeWithoutArguments(String code, Locale locale) {
return getText(code, locale);
}
private String getText(String code, Locale locale) {
Map<String, String> localized = properties.get(code);
String textForCurrentLanguage = null;
if (localized != null) {
textForCurrentLanguage = localized.get(locale.getLanguage());
if (textForCurrentLanguage == null) {
textForCurrentLanguage = localized.get(Locale.ENGLISH.getLanguage());
}
}
return textForCurrentLanguage != null ? textForCurrentLanguage : code;
}
public void reload() {
properties.clear();
properties.putAll(loadTexts());
}
protected Map<String, Map<String, String>> loadTexts() {
log.debug("loadTexts");
Map<String, Map<String, String>> m = new HashMap<String, Map<String, String>>();
List<Text> texts = textDAO.findAll();
for(Text text: texts) {
Map<String, String> v = new HashMap<String, String>();
v.put("en", text.getEn());
v.put("de", text.getDe());
m.put(text.getKey(), v);
}
return m;
}
}
推荐答案
basename
是字符串,因此它不是spring bean,因此没有注入.
basename
is a string, so it is not a spring bean, and hence no injection there.
您可以尝试做的是继承ReloadableResourceBundleMessageSource
的子类,并在那里重写某些方法(例如-getMessage(..)
). DAO应该被注入到子类中.
What you can try to do is to subclass ReloadableResourceBundleMessageSource
and override some methods there (for example - getMessage(..)
). The DAO should be injected in the subclass.
这篇关于Spring中数据库驱动的资源包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!