我的代码遇到了一些问题,并且总是抛出NullPointerException
:
public class WhateverResource extends ServerResource {
@Get("json")
public Representation represent(){
InputStream is = getContext().getClass().getClassLoader().getResourceAsStream("/whatever.properties");
Properties props = new Properties();
try {
props.load(is); // NPE here!
String whatever = props.getProperty("whatever_key");
setStatus(Status.SUCCESS_OK);
} catch (IOException e) {
e.printStackTrace();
setStatus(Status.SERVER_ERROR_INTERNAL);
}
return new StringRepresentation(props.toString());
}
}
我检查了生成的WAR文件,在目标文件夹中properties
文件夹下有WEB-INF
个文件。这段代码可能有什么问题?
答案 0 :(得分:4)
答案是这样做:
InputStream is = getContext().getClass().getResourceAsStream("/whatever.properties");
GAE可以毫无问题地读取流。
没有getClassLoader()
答案 1 :(得分:1)
将属性放在eclipse中的java源文件夹(src)中,它会自动复制到类文件夹中。然后应用程序可以使用它。
答案 2 :(得分:1)
为App Engine上的ClassLoader实现找到了不同的行为。在类中,例如MyClass,案例1返回null,而案例2返回filePath的非null流(来自war / WEB-INF / classes文件夹):
案例1:
ClassLoader classLoader = getClass().getClassLoader();
InputStream inputStream1 = classLoader.getResourceAsStream("filePath");
案例2:
InputStream inputStream2 = MyClass.class.getResourceAsStream("filePath");
所以,最好使用案例2。
答案 3 :(得分:0)
以我的经验,在 Google App Engine 上,最好使用 FileInputStream 类读取部署目录中的任何文件,例如war或target:
try (InputStream inputStream = new FileInputStream("propFileName")){
if (inputStream != null) {
Properties prop = new Properties();
prop.load(inputStream);
//go ahead and code further
}
} catch (IOException e) {
//handle exception
}
注意: FileInputStream类允许您读取根目录(WAR文件夹)下的任何文件,而ClassLoader.getResource(...)或ClassLoader.getResourceAsStream(...)仅允许您读取ClassPath根目录下的文件,即源构建输出文件夹下的文件,通常是war / WEB-INF目录中的“ classes”文件夹或类似的部署目标文件夹。