getResourceAsStream始终返回null(Google App Engine)

时间:2014-12-31 06:21:50

标签: java google-app-engine restlet

我的代码遇到了一些问题,并且总是抛出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个文件。这段代码可能有什么问题?

4 个答案:

答案 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”文件夹或类似的部署目标文件夹。