最後,我得到它的工作。 null問題是因爲resources.getEnvironment()
返回在DefaultServlet
處初始化的空白環境對象。並且ProxyDirContext
構造函數有contextName = env.get(CONTEXT); int i = contextName.indexOf('#');
會拋出null。無論如何,這是工作代碼。
首先,它延伸的Tomcat WebdavServlet
並重寫resources
內的servlet init()
如果配置外部repoPath
。
public class MyWebdavServlet extends WebdavServlet {
@Override
public void init() throws ServletException {
super.init();
String repoPath = getServletConfig().getInitParameter("repoPath");
if (Strings.isNullOrEmpty(repoPath)) {
return;
}
FileDirContext fileDirContext = new FileDirContext();
fileDirContext.setDocBase(repoPath);
//Hashtable<String, String> env = resources.getEnvironment(); won't work, throw null when we construct ProxyDirContext!
//setup environment object manually
Hashtable<String, String> env = new Hashtable<>();
env.put(ProxyDirContext.HOST, resources.getHostName());
env.put(ProxyDirContext.CONTEXT, resources.getContextPath());
resources = new ProxyDirContext(env, fileDirContext);
}
//do more override...
}
而且在web.xml
servlet映射將是:
<servlet>
<servlet-name>webdav</servlet-name>
<servlet-class>com.sankholin.webdav.MyWebdavServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>repoPath</param-name>
<param-value>/data</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>webdav</servlet-name>
<url-pattern>/webdav/*</url-pattern>
</servlet-mapping>