1つのサーバーにwarパッケージとしてデプロイされたJava Webアプリケーションがありました。別のサーバー(Tomcat 7を使用している両方のサーバー)に移動すると、次のエラーが発生します。ServletContext.getRealPath()はTomcat 7でnullを返します
はHTTP Status 500 - Servlet.init() for servlet amie.demo.AMIEServlet threw exception
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-パスは」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-パス」プロパティによって参照されるファイルは、の.warパッケージのルートに配置されています。私が言ったように、これは以前のサーバーでうまくいったので、設定に問題があると思われます。どんなヒントも高く評価されます。
リソースはファイルシステムではなく、warファイルにあります。したがって、このメソッドは文書化されているようにnullを返します。 ServletContext.getResourceAsStreamを使用してリソースをロードします。これらはファイルではなく、warファイルに埋め込まれたリソースであるため、ファイルIOではありません。 –
また、書き込みが必要な場合は、tomcatを設定して、WARを展開します。あまりいい。 –
@JBNizet私はあなたのコメントが答えのように見えるときに、あなたがコメントで答えることを選んだ理由が不思議です...? –