Установите языковой стандарт по умолчанию в конфигурации для последующего использования в интеграционном тесте

У меня есть интеграционный тест, который загружает основную веб-конфигурацию приложения.

У меня есть класс тестирования интеграции, который настроен с аннотациями:

@SpringBootTest(classes = { ApplicationConfiguration.class, WebConfiguration.class })
@RunWith(SpringRunner.class)
@WebAppConfiguration

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

@Test
public void testRuntimeException() throws Exception {
    Locale defaultLocale = Locale.getDefault();
    defaultLocale = LocaleContextHolder.getLocale();
    this.mockMvc.perform(
            get("/error/rte").headers(httpHeaders)
            .accept(MediaType.APPLICATION_JSON)
        )
        .andExpect(status().isInternalServerError())
        .andExpect(jsonPath("$.message").value(localizeErrorMessage("error.rte")))
        .andReturn();
}

Два вышеупомянутых способа получения локали, оба возвращают локаль fr_FR.

Я подозреваю, что это потому, что мой (Linux) OS пользователь имеет этот fr_FR имеет локаль.

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

Я попытался использовать любой из этих преобразователей локали:

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver localeResolver = new CookieLocaleResolver();
    localeResolver.setDefaultLocale(Locale.ENGLISH);
    return localeResolver;
}

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

При их использовании тест всегда возвращает локаль fr_FR.

Кроме того, если в заголовке запроса задан языковой стандарт, он игнорируется, и в ответе используется языковой стандарт по умолчанию, при этом следующий тест (содержащий два разных способа задания языкового стандарта заголовка запроса) завершился неудачно:

httpHeaders.add(HttpHeaders.ACCEPT_LANGUAGE, Locale.FRENCH.toLanguageTag());
this.mockMvc.perform(
        get("/error/npe").headers(httpHeaders).locale(Locale.FRENCH)
        .accept(MediaType.APPLICATION_JSON))
        .andDo(print()
    )
    .andExpect(status().isInternalServerError())
    .andExpect(jsonPath("$.message").value(localizeErrorMessage("error.npe", Locale.FRENCH)))
    .andReturn();

Я использую Spring Boot 2.0.3.RELEASE,

ОБНОВИТЬ:

Чтобы заголовок языка запроса был замечен сервером, мне пришлось использовать AcceptHeaderLocaleResolver решатель, для SessionLocaleResolver и AcceptHeaderLocaleResolver распознаватели не заметят заголовок языка запроса.

Итак, моя конфигурация выглядит так:

private static final List<Locale> SUPPORTED_LOCALES = Arrays.asList(Locale.ENGLISH, Locale.FRENCH);

@Bean
public LocaleResolver localeResolver() {
    AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
    localeResolver.setSupportedLocales(SUPPORTED_LOCALES);
    localeResolver.setDefaultLocale(Locale.ENGLISH);
    return localeResolver;
}

У меня также есть в конфигурации перехватчик локали:

// The locale interceptor provides a way to switch the language in any page
// just by passing the lang=’en’, lang=’fr’, and so on to the url
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName(LOCALE_LANGUAGE_PARAM);
    return localeChangeInterceptor;
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(localeChangeInterceptor());
    registry.addInterceptor(webContentInterceptor());
}

Но используя AcceptHeaderLocaleResolver означает, что URL lang Параметр не замечен, поэтому я не могу использовать его в запросах. Вышеуказанный перехватчик бесполезен. Пока можно использовать только заголовок.

0 ответов

Stephane,

У меня была та же проблема, и в поисках решения я обнаружил следующее: Решение для разрешения установки локали по умолчанию при весенней загрузке

Вставить в src/main/resources/application.properties файл, следующий код и отредактируйте локаль:

#setting to default locale
spring.mvc.locale=pt_BR
#force locale resolver to spring boot reconized your settings
spring.mvc.locale-resolver=fixed

Это работает для меня и удивляет своей простотой. Я надеюсь, что это поможет вам!

С наилучшими пожеланиями! Иисус

Другие вопросы по тегам