2013-04-12 36 views
0

我使用Seam 2的LocaleSelector設置在我的應用程序的語言環境,其工作正常SEAM localeSelector不注射

我也使用JAWR的國際化信息生成器,使可用的JavaScript變數的消息,按照說明here我創建瞭解決當前地區的類,以便JAWR加載正確的消息包,這裏是我的代碼

@Name("localeResolver") 
public class LocaleResolver implements net.jawr.web.resource.bundle.locale.LocaleResolver { 

    @In private LocaleSelector localeSelector; 

    public LocaleResolver() {} 

    @Override 
    public String resolveLocaleCode(HttpServletRequest request) { 
     if(localeSelector!=null){ 
      System.out.println("locale selector is not null setting jawr locale to "+localeSelector.getLocaleString()); 
      return localeSelector.getLocaleString(); 
     }else{ 
      System.out.println("locale selector is null setting jawr locale to "+request.getLocale().toString()); 
      return request.getLocale().toString(); 
     } 
    } 
} 

但localeSelector總是空,所以它使用request.getLocale,這似乎是設置瀏覽器默認的語言環境(如果用戶希望手動覆蓋,則不適用)

爲什麼注入的localeSelector爲空,我已經成功地將其注入到其他組件中?

感謝

更新:web.xml文件內容

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
<context-param> 
    <param-name>facelets.DEVELOPMENT</param-name> 
    <param-value>true</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 
<context-param> 
    <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name> 
    <param-value>com.sun.facelets.FaceletViewHandler</param-value> 
</context-param> 
<context-param> 
    <param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name> 
    <param-value>Mojarra-1.2</param-value> 
</context-param> 
<context-param> 
    <param-name>org.richfaces.SKIN</param-name> 
    <param-value>plain</param-value> 
</context-param> 
<!-- Richfaces Global Ajax Que, 
    added as getting concurrent conversation access exceptions 
    from unknown locations --> 
<context-param> 
    <param-name>org.richfaces.queue.global.enabled</param-name> 
    <param-value>true</param-value> 
</context-param> 

<filter> 
    <filter-name>Seam Filter</filter-name> 
    <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class> 
</filter> 

<!-- Seam --> 
<listener> 
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class> 
</listener> 
<servlet> 
    <servlet-name>Seam Resource Servlet</servlet-name> 
    <servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class> 
</servlet> 
<!-- JSF --> 
<servlet> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <servlet-class>org.jboss.seam.document.DocumentStoreServlet</servlet-class> 
</servlet> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<!-- jawr Servlet --> 

<servlet> 
    <servlet-name>JavascriptServlet</servlet-name> 
    <servlet-class>net.jawr.web.servlet.JawrServlet</servlet-class> 

    <!-- Location in classpath of the config file --> 
    <init-param> 
     <param-name>configLocation</param-name> 
     <param-value>/jawr.properties</param-value> 
    </init-param> 
    <init-param> 
     <param-name>mapping</param-name> 
     <param-value>/jsJawrPath/</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>JavascriptServlet</servlet-name> 
    <url-pattern>/jsJawrPath/*</url-pattern> 
</servlet-mapping> 


<!-- Store item Servlet --> 
<servlet-mapping> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <url-pattern>*.csv</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <url-pattern>*.xls</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Document Store Servlet</servlet-name> 
    <url-pattern>*.pdf</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<!-- 120 min session timeout --> 
<session-config> 
    <session-timeout>120</session-timeout> 
</session-config> 
<!-- Mime types --> 
<mime-mapping> 
    <extension>htc</extension> 
    <mime-type>text/x-component</mime-type> 
</mime-mapping> 
<!-- Index file def --> 
<welcome-file-list> 
    <welcome-file>index.xhtml</welcome-file> 
</welcome-file-list> 
<!-- Server error page --> 
<error-page> 
    <error-code>500</error-code> 
    <location>/error.xhtml</location> 
</error-page> 
<!-- File not found page --> 
<error-page> 
    <error-code>404</error-code> 
    <location>/resourceNotFound.xhtml</location> 
</error-page> 
<!-- Unathorised pages --> 
<error-page> 
    <error-code>401</error-code> 
    <location>/notAuthorised.xhtml</location> 
</error-page> 
<error-page> 
    <error-code>403</error-code> 
    <location>/index.xhtml</location> 
</error-page> 
</web-app> 

回答

0

好吧,我通過手動查找該組件,而不是注射使用解決了這個以下

public class LocaleResolver implements net.jawr.web.resource.bundle.locale.LocaleResolver { 

    public LocaleResolver() {} 

    public String resolveLocaleCode(HttpServletRequest request) { 
     //Lookup component manually as not part of SEAM lifecycle 
     LocaleSelector localeSelector = (LocaleSelector)Contexts.getSessionContext().get(LocaleSelector.class); 
     if(localeSelector!=null){ 
      return localeSelector.getLocaleString(); 
     }else{ 
      return request.getLocale().toString(); 
     } 
    } 
} 

我相信這是因爲實施的LocaleResolver不是縫生命週期的一部分,因此不會被攔截,但我可能是錯的......?

+0

不完全的問題是,'的LocaleResolver '不被稱爲Se我的組件和雙射不會發生。如果它不在生命週期中,那麼當檢索組件時(在'Context不活動的行中的某些內容)時會出錯。請注意,您可以使用靜態幫助器方法LocaleSelector.instance()來獲得'LocaleSelector'組件。此功能對許多其他默認Seam組件都很常見。 – EmirCalabuch

+0

@EmirCalabuch感謝您的提示,我嘗試了以下內容:private static LocaleSelector localeSelector = LocaleSelector.instance();但我得到'沒有活動的會話上下文',你可以擴展我如何使用LocaleSelector.instance()在我的POJO?還是它需要成爲一個SEAM組件? – DaveB

+0

這說明了你的問題,發佈爲答案。 – EmirCalabuch

1

您的LocaleResolver被調用爲不通過標準JSF Servlet路由的獨立Servlet請求的一部分。發生這種情況時,Seam攔截器不會觸發,並且不會發生雙向注入。

爲了解決這個問題,你需要通知傳入的請求縫,使其正確(注意,你需要關閉的生命週期,從而返回所得到的值不會做),設置其背景:

ServletLifecycle.beginRequest(request); 
String locale = LocaleSelector.instance().getLocaleString(); 
ServletLifecycle.endRequest(); 
return locale; 

或者,你可以使用提供ContextualHttpServletRequest類,它確實在一個更清潔的方式同樣的事情(關生命週期的finally塊等):

final String[] locale = new String[1]; 
new ContextualHttpServletRequest(request) { 
    @Override 
    public void process() throws ServletException, IOException { 
     // Do the things that need to access Seam contexts within this function: 
     locale[0] = LocaleSelector.instance().getLocaleString(); 
    } 
}.run(); 
return locale[0]; 
+0

好的,有用的信息,你能解釋爲什麼這比我目前正在做的手動查找更好嗎? (然後我可以將其標記爲正確) – DaveB

+0

由於在你的代碼中'localeSelector'總是'null',所以你總是在請求中設置語言環境。該值不一定與應用程序的區域設置相同。例如,假設我的瀏覽器具有「it」的默認語言環境,並且您的應用程序不支持此默認語言爲「en」的應用程序。在這種情況下,'localeSelector'會返回'en','request.getLocale()'會返回'it'。另外,我給出的解決方案允許您使用任何* Seam組件,而不僅僅是區域設置。 – EmirCalabuch

+0

我嘗試了兩種建議,並且它們都導致頁面加載時出現「無活動應用程序上下文」異常。另外要說明的是,我的答案中的localeSelector並非總是空,我只添加了request.getLocale()作爲後備。我仍然想要正確獲取LocaleSelector,你有什麼建議嗎? – DaveB