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ù 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