由RichFaces 4.2.2Final不尊重由Tomcat 7设置的javax.servlet.context.tempdir的值

时间:2012-07-25 17:04:35

标签: jsf tomcat servlets richfaces

我在Tomcat的<Parameter name="javax.servlet.context.tempdir" value="${catalina.base}/my_temp" override="false"/>文件的<Context>节点内提供context.xml

我知道在服务器启动时会看到它因为此日志消息:

INFO: Creating LRUMap cache instance using parameters: {javax.servlet.context.tempdir=D:\{omitted}\tmp0\my_temp, org.richfaces.resourceMapping.enabled=true, javax.faces.PROJECT_STAGE=Development, javax.faces.SKIP_COMMENTS=true}

但是,当在RichFaces FileUploadFacesContextFactory.getTempFilesDirectory()方法中单步执行代码时,调用servletContext.getAttribute("javax.servlet.context.tempdir")(其中servletContextorg.apache.catalina.core.ApplicationContextFacade的实例)会给出值{{1 }}

我的印象(来自Tomcat Docs on context parameters)设置D:\{omitted}\tmp0\work\Catalina\localhost\_应该让任何应用程序都不为此参数提供替代值。

这是预期的行为吗?我的配置错误?

1 个答案:

答案 0 :(得分:1)

你误解了<Parameter>的作用:它设置了一个ServletContext&#34; init-param&#34;与<context-param><param-name>javax.servlet.context.tempdir</param-name>...</context-param>中的WEB-INF/web.xml相同。

RichFaces正在查看正式的Context属性,这是不同的。如果您希望您的Web应用程序在启动时将init-param复制到context-attribute,那么您将要创建一个ServletContextListener,在您的webapp启动时执行类似于以下内容的代码:

servletContext.setAttribute("javax.servlet.context.tempdir",
                            servletContext.getInitParam("javax.servlet.context.tempdir"));

请注意,更改tmpdir的值可能不是一个好主意:它可能会影响容器管理资源的能力。