在配置中设置默认语言环境,以供以后在集成测试中使用

时间:2018-07-10 13:26:13

标签: spring-boot locale

我有一个集成测试,可以加载应用程序的主要Web配置。

集成测试类配置有注释:

@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)操作系统用户具有此fr_FR的语言环境。

我希望我的应用程序忽略OS用户的语言环境,因此尝试在应用程序的配置中指定默认语言环境。

我尝试使用这些区域设置解析器的eihttps://jira.spring.io/browse/SPR-16775:

@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解析器,因为SessionLocaleResolverCookieLocaleResolver解析器不会注意到请求语言标头

所以我的配置如下:

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参数,因此我不能在请求中使用它。上面的拦截器是没有用的。现在只能使用标题。

更新:我注意到使用Locale.getDefault()会忽略localeResolver bean中配置的默认语言环境。要获得此默认语言环境,我必须使用:

@Autowired
private AcceptHeaderLocaleResolver localeResolver;

localeResolver.getDefaultLocale();

更新:此时语言环境拦截器似乎有一个open issue

1 个答案:

答案 0 :(得分:0)

Stephane,

我遇到了同样的问题,在寻找解决方案时,我发现了以下问题: Solution to resolve set default locale in spring boot

MyWorld文件中插入以下代码并编辑语言环境:

myWorld

这对我有用,并且它的简单性令我感到惊讶。希望对您有帮助!

最诚挚的问候! 耶稣