1

我正在开发一个 GWT 应用程序,我正在尝试从“war/config/config.properties”中检索文件。在 GWT 服务器端,我创建了一个名为 Config.java 的类,它创建了一个新的 Properties 对象并从 config.properties 填充它,我使用 RemoteServiceServlet 扩展了 Config,以便能够使用 getServletContext()。我正在使用以下行来加载属性

prop.load(ServletContext.class.getResourceAsStream("config/config.properties"));

我的 config.properties 文件看起来像这样

database=db
host=192.168.1.1
password=pass
user=user

我的配置类看起来像这样

public class Config extends RemoteServiceServlet {

Properties prop = new Properties();

public Config(){
    //load a properties file
    try {           
        ServletContext sc = getServletContext();            
        prop.load(sc.getResource("/config/config.properties").openStream());

        //System.out.println("Get Real Path" + getServletContext().getRealPath("config") + "/config.properties");
        //FileInputStream input = (FileInputStream) getServletContext().getResourceAsStream("/config/config.properties");
        //prop.load(new FileInputStream(getServletContext().getRealPath("/config/config.properties")));
        //prop.load(input);
        System.out.println("properties file loaded successfully");

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        System.out.println("Could not find properties file");
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NullPointerException e) {
        System.out.println("null pointer exception in loading properties file");
        e.printStackTrace();
    }
}

public String getProperty(String name){
    return prop.getProperty(name);
}

}

但是对于我的生活,我无法弄清楚为什么在加载属性时会出现空指针异常,只是拒绝工作。堆栈跟踪在这里,任何想法是我做错了什么?

java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Unknown Source)
    at java.util.Properties.load0(Unknown Source)
    at java.util.Properties.load(Unknown Source)
    at com.cbs.ioma.server.Config.<init>(Config.java:19)
    at com.cbs.ioma.server.DatabaseServiceImpl.<init>(DatabaseServiceImpl.java:61)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153)
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:463)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)``

编辑:我更改了我的代码以反映下面的评论,这里发布了新错误

> java.lang.NullPointerException    at
> javax.servlet.GenericServlet.getServletContext(GenericServlet.java:160)
>   at com.cbs.ioma.server.Config.<init>(Config.java:19)

编辑:我改变了我的课程,你能看看并告诉我我应该如何调用 servlet 吗?如果它被 Servlet 中的另一个方法调用,我不明白我应该如何覆盖该方法。我该如何实施?

public class Config extends RemoteServiceServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    Properties prop = new Properties();

    public Config(){

    }

    public String getProperty(String name){
        return prop.getProperty(name);

    }

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        super.init(config);
        try {           
            prop.load(config.getServletContext().getResource("/config/config.properties").openStream());
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
4

2 回答 2

1

我误读了你的问题。如果文件在war/config/config.properties,您应该使用

ServletContext sc = ...// get servlet context; 
sc.getResource("/config/config.properties");

javadoc中所述:

返回映射到指定路径的资源的 URL。路径必须以“/”开头,并被解释为相对于当前上下文根。

编辑

Servlet容器启动时,它使用无参数构造函数实例化您的Servlet(为您)类。Config然后它调用它的Servlet#init(ServletConfig)方法,您最终可以访问ServletContext. 这是您应该初始化Properties对象的地方。所以重写该方法并将您当前的构造函数代码移动到它。


供您参考

不要这样做

ServletContext.class.getResourceAsStream("config/config.properties")

如果config/config.properties位于类路径的根目录,请使用

ServletContext.class.getResourceAsStream("/config/config.properties")

最上面的情况将采用所在包的名称,ServletContext并尝试用它解析您指定的路径。例如,ServletContext在 中javax.servlet,所以

/javax/servlet/config/config.properties

您的资源显然不在其中。您应该指定什么路径的规则Class#getResource(String).

于 2013-10-09T21:35:57.747 回答
0

我建议您使用更高级别的库来为您处理。

例如使用ResourceBundle

ResourceBundle bundle = ResourceBundle.getBundle(fully.qualified.path.using.dots.to.properties);
bundle.getString("your_property_key");
于 2013-10-10T15:00:25.033 回答