所有
我决定在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。
有什么想法吗?
答案 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")