gpt4 book ai didi

spring - Spring 中数据库驱动的资源捆绑

转载 作者:行者123 更新时间:2023-12-02 09:00:11 26 4
gpt4 key购买 nike

我在使“数据库驱动的资源包”工作时遇到问题。在下面的示例中,TextDAO 在应用程序启动期间正确注入(inject),但是当访问 messageSource 时,会创建一个新的 Messages 对象 - 这就是重点。如何做到这一点?

<!-- 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 用于属性文件,但也许也可以实现此目的。

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,因此没有注入(inject)。

您可以尝试做的是子类化ReloadableResourceBundleMessageSource并重写其中的一些方法(例如 - getMessage(..))。 DAO 应该被注入(inject)到子类中。

关于spring - Spring 中数据库驱动的资源捆绑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5498998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com