Пакет ресурсов на основе базы данных в Spring - PullRequest
5 голосов
/ 31 марта 2011

У меня проблема с тем, чтобы "база данных на основе ресурсов" работала.В приведенном ниже примере TextDAO правильно вводится во время запуска приложения, но при обращении к 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
        ...
    }
}

RE-OPEN

Как 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;
    }
}

Ответы [ 3 ]

3 голосов
/ 31 марта 2011

basename - это строка, поэтому она не является пружинным компонентом, и, следовательно, там нет инъекций.

То, что вы можете попытаться сделать, это создать подкласс ReloadableResourceBundleMessageSource и переопределить некоторые методы там (например,- getMessage(..)).DAO следует вводить в подкласс.

2 голосов
/ 31 марта 2011

ReloadableResourceBundleMessageSource создает экземпляр класса, названного свойством basename. Этот экземпляр не будет иметь каких-либо своих зависимостей, внедренных Spring. Вот почему поле textDAO в вашем Messages объекте равно нулю.

В этом выпуске Spring имеется исходный код примера MessageSource с поддержкой JDBC в виде вложения, который можно использовать вместо ReloadableResourceBundleMessageSource.

0 голосов
/ 29 апреля 2019

Немного стар, но все еще актуален ... Я использую сервер Spring Cloud Config с бэкэндом JDBC в качестве комплекта ресурсов для i18n. Нулевой код Работает потрясающе!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...