Datenbank-driven resource-bundle im Frühjahr
Problem habe ich, um "database-driven resource-bundle" zu arbeiten. Im Beispiel unten TextDAO
ist richtig gespritzt beim starten der Anwendung, aber wenn messageSource
zugegriffen wird, eine neue Messages
Objekt erstellt wird - das ist der Punkt. Wie diese Arbeit zu machen ?
<!-- 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
...
}
}
RE-OPEN
Als Bozho
schlage vor, ich habe meine Ressource-bundle als unten, aber das problem dynamisch zu laden. Ich nehme an, dass ReloadableResourceBundleMessageSource ist für properties-Dateien, aber vielleicht ist es möglich, diese Arbeit auch.
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;
}
}
die Frage ist nicht ganz klar - habe ich nicht bekommen, was, warum und wie Sie versuchen, es zu erreichen.
Hmm... ich brauche Ressource-bundle, bekommt Nachrichten von der db. Das ist klar, denke ich. Also, in dieser Klasse, die ich brauche, um zu injizieren, textDAO auf access-db, aber ich sehe das Nachrichten-Objekt neu erstellt wird und injiziert textDAO verloren..., Was ist nicht klar ?
Ich verstehe nicht, wo
Hmm... ich brauche Ressource-bundle, bekommt Nachrichten von der db. Das ist klar, denke ich. Also, in dieser Klasse, die ich brauche, um zu injizieren, textDAO auf access-db, aber ich sehe das Nachrichten-Objekt neu erstellt wird und injiziert textDAO verloren..., Was ist nicht klar ?
Ich verstehe nicht, wo
Messages
kommt ins Bild. basename
ist String
, so value=someapp.bundle.Messages
ist nur ein string-Wert, nicht eine spring bean.
InformationsquelleAutor marioosh | 2011-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
basename
ist ein string, also ist es nicht eine spring-bean, also auch keine Einspritzung gibt.Was Sie können versuchen, zu tun ist, um eine Unterklasse
ReloadableResourceBundleMessageSource
und überschreiben von Methoden gibt es (für Beispiel -getMessage(..)
). Das DAO sollte injiziert werden, in der Unterklasse.InformationsquelleAutor Bozho
ReloadableResourceBundleMessageSource
erstellt eine Instanz der Klasse mit dem Namen derbasename
Eigenschaft. Diese Instanz wird sich nicht von seinen Abhängigkeiten injiziert bis zum Frühjahr. Das ist, warum dietextDAO
Feld in IhrerMessages
- Objekt null ist.Diese Frühlings-Ausgabe hat den Quellcode für ein Beispiel-JDBC-backed MessageSource, als eine Anlage, die Sie stattdessen verwenden können von
ReloadableResourceBundleMessageSource
.InformationsquelleAutor Chin Huang