Jsf 2 正在读取JSF2.0中的属性文件,它也可以在战争中工作

Jsf 2 正在读取JSF2.0中的属性文件,它也可以在战争中工作,jsf-2,primefaces,glassfish-3,Jsf 2,Primefaces,Glassfish 3,要使用Glassfishv3 web服务器读取JSF2.0中的属性文件,该文件位于web应用程序的根目录,我使用以下代码- ServletContext ctx = (ServletContext) FacesContext .getCurrentInstance().getExternalContext().getContext(); String deploymentDirectoryPath = ctx.getRealPath("/"); P

要使用Glassfishv3 web服务器读取JSF2.0中的
属性
文件,该文件位于web应用程序的
根目录
,我使用以下代码-

    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"));
下面是web门户的屏幕截图-

运行门户时,我发现FileNotFound错误,因为该文件不在glassfish域中


有什么方法可以读取在开发阶段和war文件中都可以使用的属性文件吗?

您不应该使用
java.io.file
来引用web资源。它对它所处的环境一无所知。您也不应该使用
ServletContext#getRealPath()
,因为当服务器配置为在内存中而不是在磁盘上扩展WAR文件时,它可能会返回
null
,这在第三方主机中是您无法控制的

只需使用
InputStream
直接获取web资源即可。它采用相对于webcontent根目录的路径

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

更新它似乎根本不是一个web资源。您应该将文件移动到“WebContent”文件夹中,如屏幕截图所示。或者,更好的方法是使用
/WEB-INF
文件夹,这样就没有人可以通过URL访问它

properties.load(ec.getResourceAsStream("/WEB-INF/portal-config.properties"));
另一种方法是将其放在classpath中,即屏幕截图所示的“Java源代码”文件夹中。您不需要将其放入包中,这是可选的。假设您没有将其放入软件包中,那么请执行以下操作:

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

(请注意,路径不能以斜杠开头!)

使用
ExternalContext ec=FacesContext.getCurrentInstance().getExternalContext()获取
java.lang.NullPointerException
;Properties prop=新属性();load(ec.getResourceAsStream(File.separator+“grinder config.properties”)null
?顺便说一下,请不要使用
File.separator
。我在答复中没有提到这一点。类路径/资源路径不是磁盘文件系统路径。使用Windows特定的磁盘文件系统路径分隔符\将破坏它
正在抛出
java.lang.NullPointerException
。你想让我做些交叉检查吗?你不够具体。看起来好像您不知道抛出
NullPointerException
的确切原因。你一直在说你得到了一个
NullPointerException
,而不是说什么实例是
null
(这反过来会在被访问/调用时逻辑上导致NPE)。当代码试图访问/调用
null
对象时,将抛出NPE。在该行中可能有三个实例,它们是
null
prop
ec
和返回的
InputStream
。那么,再一次,什么是
null
?根目录?屏幕截图显示它在
WebContent
内,或者我是盲人?我的答案应该在web文件夹中。无论如何将它放在项目根目录中是很奇怪的。将其放在web文件夹或源文件夹中。如果将其放在源文件夹(“Java资源”)中,则可以通过
Thread.currentThread().getContextClassLoader().getResourceAsStream(“portal config.properties”)
等方式从类路径获取它(不带斜杠!)