2014-08-28 72 views
1

我有Java Web應用程序,它與jFuzzyLogic庫一起使用,它使用位於WEB-INF/rules/rules.fclrules.fcl文件。正確加載文件打包在.war文件中

在我的本地服務器的一切似乎工作,但是當我部署戰爭的Heroku,我得到這個錯誤:

java.lang.NullPointerException 
java.io.FileInputStream.<init>(FileInputStream.java:133) 
java.io.FileInputStream.<init>(FileInputStream.java:96) 
java.io.FileReader.<init>(FileReader.java:58) 
net.sourceforge.jFuzzyLogic.FIS.load(FIS.java:143) 
net.sourceforge.jFuzzyLogic.FIS.load(FIS.java:130) 
com.vukstankovic.professionalorientation.Results.calculation(Results.java:119) 

在在行119我Results我試圖加載rules.fcl這樣的:

FIS fis = FIS.load(ctx.getRealPath("WEB-INF/rules/rules.fcl")); 

在這個方法的開頭我有這樣的註解:

@Context ServletContext ctx; 

我在做什麼錯?根據javadoc

FIS fis = FIS.load(ctx.getRealPath("/WEB-INF/rules/rules.fcl")); 

而且也:傳遞給ServletContext.getRealPath()

回答

1

您應該使用ServletContext#getResourceAsStream這將基於根級war包的加載與設計路徑文件:

InputStream inputStream = ctx.getResourceAsStream("/WEB-INF/rules/rules.fcl"); 

然後,它是由你使用的是流和IT連鎖加載文件內容。它應該是這樣的follwoing如果有一個FIS#load方法接受InputStream爲放慢參數:

boolean verbose = true; //Just choose your suitable value (verbose mode or not) 
FIS fis = FIS.load(inputStream, verbose); 

正是從這個svn repo抓住了方法簽名。

+0

問題是'FIS.load'需要'String'作爲參數 – 2014-08-28 10:20:56

+0

非常感謝您的支持。它的工作原理就像它應該 – 2014-08-28 11:00:40

+0

很高興聽到它:) – tmarwen 2014-08-28 11:14:05

0

路徑應以'/'字符開始

This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).

所以,如果沒有提取您的.war存檔,此方法不會工作。確保你部署的.war文件被解壓縮。