在Servlet中加载XML文件时抛出NPE的Java Properties类?

时间:2014-02-26 10:12:16

标签: java servlets nullpointerexception

所有

我决定在servlet中采用 java.util.Properties 类来简化配置的维护。

我正在使用poperties类函数loadFromXML来获取一个XML文件,该文件包含我的servlet随后将执行的变性(XML兼容)SQL查询。

使用此代码在正常的CLI Java应用程序中正常工作:

// retrieve all queries from xml from classpath
    queries = new Properties();
    try
    {
        String path = getServletContext().getRealPath("/WEB-INF");
        System.out.println(path + "/queries.xml");
        queries.loadFromXML(MyServlet.class.getResourceAsStream(path + "/queries.xml"));
    }
    catch (IOException io)
    {
        io.printStackTrace();
    }

输出是loadFromXML方法抛出的NULL指针异常

  

显示java.lang.NullPointerException           在java.util.Properties.loadFromXML(Properties.java:851)

该文件存在为由Web服务器日志中的系统输出消息生成的。

  

CORE3282:stdout:/u02/SunONE61060/testserver/myservlet/WEB-INF/queries.xml

我尝试将XML文件移动到Servlet类所在的基本目录,并从那里调用它,但仍然是相同的NPE。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

获取真实路径然后将其视为资源路径的一部分无效。事实并非如此。下定决心。只是做

getResourceAsStream("/WEB-INF/classes/.../queries.xml")

其中...是MyServlet的包,并将资源文件放在那里。

答案 1 :(得分:1)

你的问题在这里:

MyServlet.class.getResourceAsStream(path + "/queries.xml")

这将返回null.getResourceAsStream()只能从类路径加载(例如,/com/foo/myclass/MyResource.xml)。

由于您拥有资源的绝对路径,因此只需使用标准FileInputStream

此外:完成后关闭您的信息流。现在你没有:你有资源泄漏。请参阅Closeable的javadoc。

答案 2 :(得分:1)

您正在尝试从类路径加载资源,但正在提供真实路径。这两个不一样。

使用时

MyServlet.class.getResourceAsStream("queries.xml")

然后类加载器将尝试从您的MyServlet.class文件加载类,因此如果包是my.pkg,它将尝试从WEB-INF/classes/my/pkg/queries.xml加载它。

您还可以将查询放入类层次结构的根(WEB-INF/classes/queries.xml)并加载它,如下所示:

MyServlet.class.getResourceAsStream("/queries.xml")

然后它会在WEB-INF/classes/queries.xml

中找到该文件

或者,如果要将文件保留在原来的位置,只需使用servlet上下文来获取输入流:

getServletContext().getResourceAsStream("/WEB-INF/queries.xml")