2016-11-01 24 views
1

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パッケージのルートに配置されています。私が言ったように、これは以前のサーバーでうまくいったので、設定に問題があると思われます。どんなヒントも高く評価されます。

+2

リソースはファイルシステムではなく、warファイルにあります。したがって、このメソッドは文書化されているようにnullを返します。 ServletContext.getResourceAsStreamを使用してリソースをロードします。これらはファイルではなく、warファイルに埋め込まれたリソースであるため、ファイルIOではありません。 –

+0

また、書き込みが必要な場合は、tomcatを設定して、WARを展開します。あまりいい。 –

+0

@JBNizet私はあなたのコメントが答えのように見えるときに、あなたがコメントで答えることを選んだ理由が不思議です...? –

答えて

2

リソースはファイルシステム内ではなく、warファイル内にあります。したがって、このメソッドは文書化されているようにnullを返します。

ServletContext.getResourceAsStream()を使用してリソースをロードします。これらはファイルではなく、warファイルに埋め込まれたリソースであるため、ファイルIOではありません。

0

ディレクトリが存在しない場合、新しいディレクトリが作成されます。

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

if (!new File(realPathtoUploads).exists()) { 
    new File(realPathtoUploads).mkdir(); 
} 
関連する問題