Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ServletContext.getRealPath()在Tomcat 7上返回null_Java_Tomcat7 - Fatal编程技术网

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

Java ServletContext.getRealPath()在Tomcat 7上返回null,java,tomcat7,Java,Tomcat7,我在一台服务器上部署了一个可用的Java Web应用程序作为war包,当我将其移动到另一台服务器(两台服务器都使用Tomcat 7)时,我得到以下错误: Servlet amie.demo.AMIEServlet的HTTP状态500-Servlet.init() 抛出异常 java.lang.NullPointerException java.io.File.(File.java:277) amie.demo.AMIEServlet.init(AMIEServlet.java:92) 导致问题的

我在一台服务器上部署了一个可用的Java Web应用程序作为war包,当我将其移动到另一台服务器(两台服务器都使用Tomcat 7)时,我得到以下错误:

Servlet amie.demo.AMIEServlet的HTTP状态500-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>

阿米德莫
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
kb路径
yago2core.10kseedsSample.decoded.compressed.notypes.nolangcode.usascii.tsv
kb元数据
yagoWikipediaInfo.relevance.sample.tsv

“kb path”属性引用的文件位于.war包的根目录下。正如我所说,这在以前的服务器中起作用,因此我怀疑存在配置问题。任何提示都将不胜感激

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


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

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

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

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

资源位于war文件中,而不是文件系统中。因此,该方法返回null,如文档所示。使用ServletContext.getResourceAsStream加载资源。不是文件IO,因为它们不是文件,而是嵌入到war文件中的资源。或者,如果您也需要编写,请配置tomcat以解压缩war。不太好。@JBNizet我很好奇为什么你选择在评论中回答,而你的评论看起来像是回答…?@JimGarrison你是对的。我创造了一个答案。