Весенняя загрузка: как получить доступ к локали в службах или репозиториях

#java #spring #spring-boot #internationalization #locale

#java #весна #spring-boot #интернационализация #локали

Вопрос:

Я следовал некоторым руководствам по интернационализации в Spring Boot.

(https://www.youtube.com/watch?v=Y7pHhui0cD4 и https://www.baeldung.com/spring-boot-internationalization)

Я зашел так далеко, чтобы настроить его следующим образом:

 @Configuration
public class InternationalizationConfiguration {


    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.GERMAN);
        return sessionLocaleResolver;
    }

    @Bean 
    public ResourceBundleMessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        messageSource.setUseCodeAsDefaultMessage(true);
        return messageSource;
    }

}
 

и использовать его в RestConroller следующим образом:

 
@RestController
public class ExperimentalControllerImpl implements ExperimentalController{

    @Autowired
    ResourceBundleMessageSource messageSource;

    @Override
    public String testI18n(@RequestHeader("Accept-Language") String locale) {
        StringBuilder builder = new StringBuilder();
        builder.append(messageSource.getMessage(Messages.HELLO, null, new Locale(locale)));
        builder.append("n");
        builder.append(messageSource.getMessage(Messages.HOW_ARE_YOU, null, new Locale(locale)));
        return builder.toString();
    }

}
 

Это работает нормально…..

Но как мне получить информацию о локали из заголовка запроса на мой уровень обслуживания или уровни репозитория?

Существует ли наилучшая практика хранения информации о том, какой язык отправляется запросом, чтобы я мог получить к ней доступ в своих сервисах и репозиториях? Я думаю, что значение должно быть специфичным для запроса / потока. Передача его в качестве параметра метода на другой уровень кажется довольно некрасивой.

С уважением, из Германии

Комментарии:

1. Код — это код, а не картинки. (Кроме того, ссылка на эти «некоторые учебные пособия», поскольку кажется, что они могут быть не совсем надежными; Boot уже выполняет часть того, что вы опубликовали.)

2. В вашем контроллере вы уже делаете это неправильно. Просто введите Locale в метод. Если вам это нужно где-то еще, используйте LocalContextHolder.getLocale() . Однако MessageSource он уже делает это внутренне, поэтому вместо того, чтобы передавать его, просто передайте null .

3. Привет, Дейнум, вводишь Локализацию в Метод? public String testI18n(Local locale) {} не работает. Введенный языковой стандарт всегда ‘de’, даже когда я помещаю ‘en’ в заголовок моего запроса (Accept-Language), вероятно, потому, что он используется по умолчанию. LocalContextHolder.getLocale() доставляет «де» тоже все время. Мне нужна локаль, которая отправляется в запросе, чтобы генерировать интернационализированные сообщения об исключениях на уровне сервиса. Что я делаю не так?