Base de données des ressources axée sur bundle au Printemps
J'ai un problème pour faire "de la base de données des ressources axée sur bundle" de travail. Dans l'exemple ci-dessous TextDAO
est bien injecté au cours de démarrage de l'application, mais quand messageSource
est accessible, une nouvelle Messages
objet est créé - c'est le point. Comment faire pour faire ce travail ?
<!-- 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
...
}
}
RÉ-OUVRIR
Comme Bozho
suggèrent j'ai fait de mon regroupement de ressources comme ci-dessous, mais le problème de manière dynamique le recharger. Je suppose que ReloadableResourceBundleMessageSource est pour les propriétés des fichiers, mais peut-être qu'il est possible de travailler aussi.
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;
}
}
la question n'est pas tout à fait claire: je n'ai pas le quoi, le pourquoi, et comment vous essayez de le réaliser.
Hmm... j'ai besoin de regroupement de ressources qui reçoit des messages de db. C'est clair je pense. Ainsi, dans la classe que j'ai besoin d'injecter de textDAO pour accéder à la db, mais je vois que les Messages de l'objet est recréé et injecté textDAO perdu... Ce qui n'est pas clair ?
Je n'ai pas compris où
Hmm... j'ai besoin de regroupement de ressources qui reçoit des messages de db. C'est clair je pense. Ainsi, dans la classe que j'ai besoin d'injecter de textDAO pour accéder à la db, mais je vois que les Messages de l'objet est recréé et injecté textDAO perdu... Ce qui n'est pas clair ?
Je n'ai pas compris où
Messages
entre dans l'image. basename
est String
, donc value=someapp.bundle.Messages
est juste une chaîne de valeur, pas un printemps bean.
OriginalL'auteur marioosh | 2011-03-31
Vous devez vous connecter pour publier un commentaire.
basename
est une chaîne de caractères, de sorte qu'il n'est pas un printemps de haricot, et donc pas d'injection.Ce que vous pouvez faire, c'est de la sous-classe
ReloadableResourceBundleMessageSource
et de redéfinir certaines méthodes (par exemple -getMessage(..)
). Le DAO doit être injecté dans la sous-classe.OriginalL'auteur Bozho
ReloadableResourceBundleMessageSource
crée une instance de la classe nommée par lebasename
de la propriété. Cette instance n'aura pas de ses dépendances injecté par le Printemps. C'est pourquoi latextDAO
champ dans votreMessages
objet est null.Ce numéro de Printemps a le code source pour un exemple JDBC soutenu MessageSource, comme une pièce jointe, que vous pouvez utiliser à la place de
ReloadableResourceBundleMessageSource
.OriginalL'auteur Chin Huang
Un peu vieux, mais toujours pertinents...
Je suis à l'aide de Printemps Cloud Config serveur avec JDBC backend en tant que regroupement de ressources pour l'i18n.
Zéro code. Œuvres génial!
OriginalL'auteur Ronen