【问题标题】:Reading properties file in JSF2.0 which can work in war also在 JSF2.0 中读取属性文件,它也可以在战争中工作
【发布时间】:2013-04-05 00:41:40
【问题描述】:

要使用 Glassfishv3 网络服务器读取 JSF2.0 中的 properties 文件,该文件位于我的网络应用程序的 root directory,我使用以下代码-

    ServletContext ctx = (ServletContext) FacesContext
            .getCurrentInstance().getExternalContext().getContext();
    String deploymentDirectoryPath = ctx.getRealPath("/");
    Properties prop = new Properties();
    prop.load(new FileInputStream(deploymentDirectoryPath
            + File.separator + "portal-config.properties"));

以下是门户网站的截图-

在运行门户时,我收到 FileNotFound 错误,因为 glassfish 域中不存在该文件。

有没有什么方法可以在开发阶段和战争文件中读取属性文件?

【问题讨论】:

    标签: jsf-2 primefaces glassfish-3


    【解决方案1】:

    您不应该使用java.io.File 来引用网络资源。它对它所处的上下文一无所知。你也不应该使用ServletContext#getRealPath(),因为当服务器配置为在内存而不是磁盘上扩展WAR文件时,它可能会返回null,这超出了你在第3方的控制范围主机。

    只需使用ExternalContext#getResourceAsStream() 即可直接以InputStream 的形式获取网络资源。它采用相对于 web 内容根目录的路径。

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    properties.load(ec.getResourceAsStream("/portal-config.properties"));
    

    另见:


    更新它似乎根本不是网络资源。您应该将文件移动到“WebContent”文件夹中,如屏幕截图所示。或者,更好的是 /WEB-INF 文件夹,这样任何人都无法通过 URL 访问它。

    properties.load(ec.getResourceAsStream("/WEB-INF/portal-config.properties"));
    

    另一种方法是将它放在类路径中,即屏幕截图所示的“Java 源”文件夹。你不需要把它放在一个包里,这是可选的。假设你没有把它放在一个包里,然后这样做:

    ClassLoader cl = Thread.currentThread().getContextClassLoader();
    properties.load(cl.getResourceAsStream("portal-config.properties"));
    

    (注意路径不能以斜线开头!)

    【讨论】:

    • 获取java.lang.NullPointerExceptionExternalContext ec = FacesContext.getCurrentInstance().getExternalContext(); Properties prop = new Properties(); prop.load(ec.getResourceAsStream(File.separator+ "grinder-config.properties")); 你能检查代码吗?
    • 请退后一步。 null 到底是什么?顺便说一句,请不要使用File.separator。我在答案中没有提到它。类路径/资源路径不是磁盘文件系统路径。使用 Windows 特定的磁盘文件系统路径分隔符 \ 会破坏它。
    • prop.load(ec.getResourceAsStream("/portal-config.properties")); 正在抛出java.lang.NullPointerException。你想让我做点交叉检查吗?
    • 你不够具体。看起来好像您不知道为什么会抛出 NullPointerException。你一直告诉你有一个NullPointerException,而不是告诉null到底是什么实例(这反过来会在被访问/调用时在逻辑上导致NPE)。当代码尝试访问/调用 null 对象时,将引发 NPE。在该行中可能存在三个实例,它们是nullpropec 和返回的InputStream。那么,再一次,null 到底是什么?
    • 根目录?截图显示在WebContent里面,还是我瞎了?我的回答预计它会在 web 文件夹中。无论如何..将它放在项目根目录中很奇怪。要么把它放在 web 文件夹中,要么放在源文件夹中。如果将它放在源文件夹(“Java 资源”)中,则可以通过 Thread.currentThread().getContextClassLoader().getResourceAsStream("portal-config.properties") 等方式从类路径中获取它(不带斜线!)
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2011-09-06
    • 2011-12-16
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2014-04-17
    相关资源
    最近更新 更多