【问题标题】:Java Properties class throwing NPE when loading XML file within servlet?Java Properties 类在 servlet 中加载 XML 文件时抛出 NPE?
【发布时间】:2014-02-26 10:12:16
【问题描述】:

全部,

我决定在我的 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)

文件存在,由网络服务器日志中的系统输出消息生成。

CORE3282:标准输出:/u02/SunONE61060/testserver/myservlet/WEB-INF/queries.xml

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

有什么想法吗?

【问题讨论】:

    标签: java servlets nullpointerexception


    【解决方案1】:

    你的问题在这里:

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

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

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

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

    【讨论】:

    • 我如何在我的属性类中使用它?
    • 类似queries.loadFromXML(new FileInputStream(absolutePathHere))
    【解决方案2】:

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

    使用时

    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")
    

    【讨论】:

      【解决方案3】:

      获取真实路径然后将其视为资源路径的一部分是无效的。它不是。下定决心。做吧

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-05
        • 2016-08-09
        • 1970-01-01
        • 2015-12-29
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2011-02-09
        相关资源
        最近更新 更多