我有一个集成测试,可以加载应用程序的主要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
解析器,因为SessionLocaleResolver
和CookieLocaleResolver
解析器不会注意到请求语言标头
所以我的配置如下:
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。
答案 0 :(得分:0)
Stephane,
我遇到了同样的问题,在寻找解决方案时,我发现了以下问题: Solution to resolve set default locale in spring boot
在MyWorld
文件中插入以下代码并编辑语言环境:
myWorld
这对我有用,并且它的简单性令我感到惊讶。希望对您有帮助!
最诚挚的问候! 耶稣