我不認爲有任何陷阱。
的RequestContextUtils.getLocaleResolver(HttpServletRequest)
被實現爲
public static LocaleResolver getLocaleResolver(HttpServletRequest request) {
return (LocaleResolver) request.getAttribute(DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE);
}
換句話說,它是從HttpServletRequest
屬性得到它。 DispatcherServlet.LOCALE_RESOLVER_ATTRIBUTE
的使用給了我們暗示DispatcherServlet
可能正在設置它。它initLocaleResolver()
方法實現爲
private void initLocaleResolver(ApplicationContext context) {
try {
this.localeResolver = context.getBean(LOCALE_RESOLVER_BEAN_NAME, LocaleResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Using LocaleResolver [" + this.localeResolver + "]");
}
}
catch (NoSuchBeanDefinitionException ex) {
// We need to use the default.
this.localeResolver = getDefaultStrategy(context, LocaleResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("Unable to locate LocaleResolver with name '" + LOCALE_RESOLVER_BEAN_NAME +
"': using default [" + this.localeResolver + "]");
}
}
}
所以它是從上下文中獲取其LocaleResolver
或從一些默認的配置產生了,即。 DispatcherServlet.properties
資源。
總而言之,如果您聲明LocaleResolver
bean,那麼使用@Autowired
注入它並從RequestContextUtils.getLocaleResolver(request)
得到它將得到相同的實例。見DispatcherServlet#doService(..)
方法的
[...]
request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);
[...]
LocaleChangeInterceptor
使用static
實用,因爲它不是在春天感的bean。這是一個Spring MVC組件,不一定是WebApplicationContext
的一部分,因此不屬於它的生命週期,即。它不能有任何注入。
你聲明瞭什麼類型的'LocaleResolver' bean? –
@Sotirios Delimanolis:我在兩個項目中使用了相同的自定義更改攔截器,一個使用SessionLocaleResolver,另一個使用CookieLocaleResolver。你相信LocaleResolver的答案依賴者嗎? (如果是,請告訴我爲什麼)。 – Ralph