为什么我的Web应用程序无法访问我的.properties文件

时间:2015-01-19 19:20:59

标签: java web-applications configuration-files

我已经为我的Web应用程序正常运行所需的几个配置创建了一个.properties文件。我创建了一个用于访问此文件及其属性的测试方法,但无法使其工作。在我的Web应用程序类和我的测试方法中,我得到了相同的空指针异常,它会引导您完成工厂类和控件类的列表,但问题都在于同一方法,这是例外:

java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Unknown Source)
at java.util.Properties.load0(Unknown Source)
at java.util.Properties.load(Unknown Source)
at com.RichardDavy42.properties.Configure.getProperty(Configure.java:56)
at com.secureautodata.business.data.CustomerFactory.fetchCustomer(CustomerFactory.java:44)
at com.secureautodata.business.data.LeadAssembly.assembleLead(LeadAssembly.java:42)
at com.secureautodata.control.DirectoryAssistance.doPost(DirectoryAssistance.java:396)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:526)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:655)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1566)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1523)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

Configure.java是包含我的getProperties方法的类,其代码如下:

    /**
 * Calls on the properties file to fetch the properties that 
 * you are looking for, for use in your application.
 * @param propertyName
 * @return
 */
public static String getProperty(String nof, String propertyName){
    String property = "";

    Properties props = new Properties();

    try (InputStream input = Configure.class.getClassLoader().getResourceAsStream(nof)){

        props.load(input);
        property = props.getProperty(propertyName);

    } catch (IOException ioe) {
        System.err.println("There was an Error retrieving your data");
        ioe.printStackTrace();
    } 
    return property;
}

我尝试使用不同的调用文件的方法多次调用此文件,例如:

System.out.println("Configure Properties property retrieval " + Configure.getProperty("/WebAppRootFolder/config.properties", "enc1"));

System.out.println("Configure Properties property retrieval " + Configure.getProperty("WebAppRootFolder/config.properties", "enc1"));

System.out.println("Configure Properties property retrieval " + Configure.getProperty("/config.properties", "enc1"));

System.out.println("Configure Properties property retrieval " + Configure.getProperty("config.properties", "enc1"));

所有这些都给了我相同的例外,回顾了getProperty方法,所以我想也许我的文件是空的我打开了我的文件,发现它不是,包含这些信息:

#Mon Jan 19 13:32:58 EST 2015
enc2=aijf3w97fhfieu4bfqg8o34fibagc48wfbhhba4
enc1=sldhnf9aw7h3un429q8anf9478wfi9a7hw49hiu

我在引用它的任何地方都使用此方法,所以我在所有级别都尝试过这个。

文件结构如下:

WebAppRootFolder
|
|_src
|_TomcatLibrary
|_JUnitLibrary
|_Maven
|_Referenced
|_JRE
|_build
|_docs
|_target
|_webcontent
|_config.properties <--- config.properties in root folder
|_javadoc.xml
|_LICENSE
|_pom.xml
|_README.md

我能想到的唯一一件事就是配置类所在的PropertiesConfiguration是我创建的早期项目的jar,也许它试图在自己内部找到该文件,但我不确定这个会是这样的。

如果它有用(在这种情况下我不确定是因为我在主方法中得到的错误与其他地方一样)这是原始方法调用的流程:

User calls request on a file -->
Servlet Instantiates Factory Class -->
Factory method makes use of Config.getProperty() During file call-->
Factory method Creates Object and returns the Object to the User --X   

先谢谢你们的帮助。

1 个答案:

答案 0 :(得分:0)

为了回答这个问题,我在@cool的一些评论中得到了一些帮助,我们在这里分享了以下内容:

我使用的Configure.getProperties()方法是我在早期项目中创建的jar文件的一部分。因此,每次调用该方法时,它都在该jar文件中查找.properties文件。为了找到此错误,我将.properties文件移动到上一个项目中并重新部署了jar文件。在这样做之后,我再次测试了我当前的项目,并且中提琴就像它有效的魅力。

因此,如果将来您碰巧构建了一个需要jar文件的项目,并且该jar文件需要调用.properties文件来运行您正在构建的应用程序。必须使用jar文件部署.properties文件,或者至少您必须有一种方法可以从当前应用程序中进入该项目。

我希望这有助于解决问题。