Как прочитать все значения из ResourceBundle в Map / InputStream Spring - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть приложение с включенной функцией i18n.Итак, у меня есть несколько файлов

messages.properties
messages_en.properties
messages_fr.properties

Но для моего веб-приложения мне нужно прочитать все значения одновременно, чтобы они были кэшированы на стороне клиента.

В результате мне нужночитать все значения для определенной локали при выполнении запроса.

Я пробовал MessageSource, но он может вернуть только одну запись, но мне нужно получить все значения в виде Map или InputStream поэтому они будут преобразованы в JSON перед возвратом к клиентской стороне.

Пожалуйста, предложите способ, которым я могу прочитать все значения для определенного пакета свойств для определенного местоположения.

Спасибо

1 Ответ

0 голосов
/ 16 декабря 2018

Определите следующий класс:

import java.util.*;
import java.util.stream.Collectors;

public class MessagesResourceBundle {
    private static final String BASE_NAME = "messages";
    private static final List<String> LOCALES = Arrays.asList("en", "fr");
    private Map<Locale, Map<String, String>> allMessages;

    public MessagesResourceBundle() {
        allMessages = new HashMap<>();
        List<Locale> locales = LOCALES.stream().map(Locale::new).collect(Collectors.toList());
        locales.add(Locale.ROOT);
        locales.stream().map(l -> ResourceBundle.getBundle(BASE_NAME, l))
                .forEach(bundle -> {
                    Map<String, String> messages = new HashMap<>();
                    Collections.list(bundle.getKeys()).forEach(key -> messages.put(key, bundle.getString(key)));
                    allMessages.put(bundle.getLocale(), messages);
                });
    }

    public Map<Locale, Map<String, String>> getAllMessages() {
        return Collections.unmodifiableMap(allMessages);
    }
}

Затем в вашем @SpringBootApplication классе (или в @Configuration аннотированном классе) определите следующий метод:

@Bean
public MessagesResourceBundle messagesResourceBundle() {
    return new MessagesResourceBundle();
}

Youзатем можете внедрить его в класс, который вы хотите использовать.

...