使用getRealPath()从bean获取文件位置

时间:2014-01-22 12:25:40

标签: jsf netbeans primefaces weblogic

我从后台bean访问外部文件时遇到问题。我想做的是使用ttf文件,以便通过iText库使用该字体。当我通过Netbeans 7.2运行我的应用程序时,下面的代码工作正常:

private static String fontPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("arialuni.ttf");

但是当我通过Oracle Weblogic 11g控制台手动部署我的ear文件时,找不到ttf文件,我得到NullPointerException。

我已经尝试了几种方法让它工作但没有机会。如果有人可以帮助我,我会非常感激。

此致

2 个答案:

答案 0 :(得分:11)

当servletcontainer配置为在RAM内存空间而不是本地磁盘文件中扩展已部署的WAR时,ServletContext#getRealPath()(以及其本身也是其JSF委托者ExternalContext#getRealPath())将返回null系统空间。众所周知,“重型”服务器可以提高性能。由于无法在FileFileInputStream中进一步使用物理本地磁盘文件系统路径,因此将返回null

getRealPath()绝对是用于获取文件内容的错误工具。 Never ever use getRealPath()。您应该使用ServletContext#getResourceAsStream()(或其JSF委托人ExternalContext#getResourceAsStream())代替。

InputStream content = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/arialuni.ttf");
// ...

请注意,出于显而易见的原因,您绝对不应将InputStream指定为静态变量。如果您确实需要,请先将其读入byte[],以便安全地关闭它。

另见:

答案 1 :(得分:1)

传递给FacesContext.getCurrentInstance().getExternalContext().getRealPath()方法的相对路径必须相对于FacesServlet的上下文路径。

假设您在FacesServlet上下文路径中的"arialuni.ttf"文件夹中有resources,那么您应该将"/resources/arialuni.ttf"传递给getRealPath()方法,如下所示:

FacesContext.getCurrentInstance().getExternalContext().getRealPath("/resources/arialuni.ttf");

有关详细信息,请参阅: