我有一个工作的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包的根目录下。正如我所说,这在以前的服务器上工作,所以我怀疑存在配置问题。任何提示都将受到高度赞赏。
答案 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();
}