Установите языковой стандарт по умолчанию в конфигурации для последующего использования в интеграционном тесте
У меня есть интеграционный тест, который загружает основную веб-конфигурацию приложения.
У меня есть класс тестирования интеграции, который настроен с аннотациями:
@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
Это работает для меня и удивляет своей простотой. Я надеюсь, что это поможет вам!
С наилучшими пожеланиями! Иисус