我从后台bean访问外部文件时遇到问题。我想做的是使用ttf文件,以便通过iText库使用该字体。当我通过Netbeans 7.2运行我的应用程序时,下面的代码工作正常:
private static String fontPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("arialuni.ttf");
但是当我通过Oracle Weblogic 11g控制台手动部署我的ear文件时,找不到ttf文件,我得到NullPointerException。
我已经尝试了几种方法让它工作但没有机会。如果有人可以帮助我,我会非常感激。
此致
答案 0 :(得分:11)
当servletcontainer配置为在RAM内存空间而不是本地磁盘文件中扩展已部署的WAR时,ServletContext#getRealPath()
(以及其本身也是其JSF委托者ExternalContext#getRealPath()
)将返回null
系统空间。众所周知,“重型”服务器可以提高性能。由于无法在File
或FileInputStream
中进一步使用物理本地磁盘文件系统路径,因此将返回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");
有关详细信息,请参阅: