Java ServletContext.getRealPath()在Tomcat 7上返回null
我在一台服务器上部署了一个可用的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 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) 导致问题的
@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你是对的。我创造了一个答案。