我正在使用SEAM 2的LocaleSelector来设置我的应用程序中的区域设置正常工作
我也在使用JAWR的i18n消息生成器将消息作为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总是为null,所以它使用request.getLocale进行设置,这似乎是浏览器的默认语言环境(如果用户希望手动覆盖则不好)
为什么注入的localeSelector为null,我已成功将其注入其他组件?
由于
更新: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 :(得分:1)
您的LocaleResolver
作为单独的Servlet请求的一部分被调用,该请求未通过标准JSF Servlet路由。发生这种情况时,Seam拦截器不会被触发,也不会发生双射。
要解决此问题,您需要通知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];
答案 1 :(得分: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不是接缝生命周期的一部分,因此没有截获,但我可能错了......?