ServletContext.getRealPath()在Tomcat 7上返回null

时间:2016-11-01 22:43:12

标签: java tomcat7

我有一个工作的Java Web应用程序在一个服务器中部署为war包,当我将它移动到另一个服务器时(两个服务器都使用Tomcat 7),我收到以下错误:

  

HTTP状态500 - servlet amie.demo.AMIEServlet的Servlet.init()   抛出异常

     

java.lang.NullPointerException java.io.File。(File.java:277)     amie.demo.AMIEServlet.init(AMIEServlet.java:92)

导致问题的代码如下所示:

@Override
public void init(ServletConfig config) throws ServletException {        
    String kbPath = config.getServletContext().getInitParameter("kb-path");
    String kbAbsPath = config.getServletContext().getRealPath(kbPath);
    String metadataPath = config.getServletContext().getInitParameter("kb-metadata");
    String metadataAbsPath = config.getServletContext().getRealPath(metadataPath);
    try {
        kb.load(new File(kbAbsPath));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

问题是config.getServletContext()。getRealPath返回null。代码段中引用的属性“kb-path”在web.xml文件中定义:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>AMIEDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
    <param-name>kb-path</param-name>
    <param-value>yago2core.10kseedsSample.decoded.compressed.notypes.nolangcode.usascii.tsv</param-value>
  </context-param>  
  <context-param>
    <param-name>kb-metadata</param-name>
    <param-value>yagoWikipediaInfo.relevance.sample.tsv</param-value>
  </context-param>
</web-app>

“kb-path”属性引用的文件位于.war包的根目录下。正如我所说,这在以前的服务器上工作,所以我怀疑存在配置问题。任何提示都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

资源位于war文件中,而不是文件系统中。因此,该方法返回null,如文档所示。

使用ServletContext.getResourceAsStream()加载资源。不是文件IO,因为它们不是文件,而是嵌入到war文件中的资源。

答案 1 :(得分:0)

如果目录不存在,那么它将创建新目录。

String uploadsDir = "/uploads/";
String realPathtoUploads = request.getSession().getServletContext().getRealPath(uploadsDir);

if (!new File(realPathtoUploads).exists()) {
    new File(realPathtoUploads).mkdir();
}