2014-11-22 52 views
1

在web.xml:當我用CookieLocaleResolver的,我可以設置Cookie無效崩潰春天web應用

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext*.xml</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<servlet> 
    <display-name>Spring MVC Servlet</display-name> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

在彈簧調度-servlet.xml中

<context:component-scan base-package="lei.spring.mvc.controller" /> 

在applicationContext.xml中

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:cookieName="clientLang" /> 

在將clientLang cookie的內容設置爲en-CA之後,spring僅向我的瀏覽器返回以下異常:

java.lang.IllegalArgumentException: Locale part "en-CA" contains invalid characters 
at org.springframework.util.StringUtils.validateLocalePart(StringUtils.java:710) 
at org.springframework.util.StringUtils.parseLocaleString(StringUtils.java:690) 
at org.springframework.web.servlet.i18n.CookieLocaleResolver.parseLocaleCookieIfNecessary(CookieLocaleResolver.java:164) 
at org.springframework.web.servlet.i18n.CookieLocaleResolver.resolveLocaleContext(CookieLocaleResolver.java:136) 
at org.springframework.web.servlet.DispatcherServlet.buildLocaleContext(DispatcherServlet.java:1043) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:955) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 

然後我試圖創建自己的MyCookieLocaleResolver類捕獲所有異常並返回默認Locale實例:

public class MyCookieLocaleResolver extends CookieLocaleResolver { 
@Override 
public Locale resolveLocale(HttpServletRequest request) { 
    try { 
     return super.resolveLocale(request); 
    } catch (Exception exception) { 
     return new Locale.Builder().setLanguage("en").setRegion("CA").build(); 
    } 
} 
} 

改變的applicationContext.xml爲:

<bean id="localeResolver" class="package.MyCookieLocaleResolver" p:cookieName="clientLang" /> 

但春天還恢復同樣的例外,我的瀏覽器。我讀了DispatcherServlet的代碼。看起來這個實例this.localeResolver爲null,它不是來自localeResolver實例。它總是使用CookieLocaleResolver實例。如何將localeResolver實例設置爲DispatcherServlet?

protected LocaleContext buildLocaleContext(final HttpServletRequest request) { 

    if (this.localeResolver instanceof LocaleContextResolver) { 
     return ((LocaleContextResolver) this.localeResolver).resolveLocaleContext(request); 
    } 
    else { 
     return new LocaleContext() { 
      @Override 
      public Locale getLocale() { 
       return localeResolver.resolveLocale(request); 
      } 
     }; 
    } 
} 

回答

0

試試只用 「恩」 爲默認語言環境:

<bean id="localeResolver" 
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"> 
    <property name="defaultLocale" value="en" /> 
    <property name="cookieName" value="clientLang" /> 
    <property name="cookieMaxAge" value="31556926" /> 
</bean> 
0

我overrided兩種方法後,它工作正常:

public class MyCookieLocaleResolver extends CookieLocaleResolver { 
@Override 
public Locale resolveLocale(HttpServletRequest request) { 
    try { 
     return super.resolveLocale(request); 
    } catch (Exception exception) { 
     return Locale.forLanguageTag("en-CA"); 
    } 
} 

@Override 
public LocaleContext resolveLocaleContext(final HttpServletRequest request) { 
    try { 
     return super.resolveLocaleContext(request); 
    } catch (Exception exception) { 
     return new LocaleContext() { 
      @Override 
      public Locale getLocale() { 
       return Locale.forLanguageTag("en-CA"); 
      } 
     }; 
    } 
} 

}

相關問題