2014-02-14 36 views
0

它的技術可能可以用兩種不同的方式獲得LocaleResolver實例:通過RequestContext與通過注入獲取Spring LocalResolver?

,但是這是更好的辦法?


背景/背景:

我實現了一個自定義的變化區域設置更改攔截。這是一個HandlerInterceptor,有點像正常的LocaleChangeInterceptor,它使用注入方式獲得LocaleResolver。有效。

但今天我已經仔細看了一下LocaleChangeInterceptor。我注意到他們沒有注入LocaleResolver,而是從請求上下文(RequestContextUtils.getLocaleResolver(request))*中獲取它們。

現在我有點擔心我是否忽略了在通過注入HandlerInterceptor獲得LocaleResolver時的一個陷阱或類似的問題? - 任何想法?


*的DispatcherServlet持有LocaleResolver一個實例(通過注射或自創建獲得)並將它們放入每個請求的上下文中。

+0

你聲明瞭什麼類型的'LocaleResolver' bean? –

+0

@Sotirios Delimanolis:我在兩個項目中使用了相同的自定義更改攔截器,一個使用SessionLocaleResolver,另一個使用CookieLocaleResolver。你相信LocaleResolver的答案依賴者嗎? (如果是,請告訴我爲什麼)。 – Ralph

回答

1

我不認爲有任何陷阱。

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的一部分,因此不屬於它的生命週期,即。它不能有任何注入。

+0

因此,如果Dispatcher servlet創建LocalResolver本身(通過其DefaultStrategy),唯一剩下的缺陷是? – Ralph

+0

@Ralph好吧,如果它在應用程序上下文中沒有找到'LocaleResolver',那也意味着不會有注入的候選人,所以你的應用程序無論如何都不會啓動。 –