我在从 back bean 访问外部文件时遇到问题。我想做的是使用 ttf 文件以便通过 iText 库使用字体。当我通过 Netbeans 7.2 运行我的应用程序时,下面的代码工作正常:
private static String fontPath = FacesContext.getCurrentInstance().getExternalContext().getRealPath("arialuni.ttf");
但是当我通过 Oracle Weblogic 11g 控制台手动部署 Ear 文件时,找不到 ttf 文件,并且出现 NullPointerException。
我尝试了多种方法让它发挥作用,但没有机会。如果有人可以帮助我,我将不胜感激。
问候
最佳答案
ServletContext#getRealPath()
(本质上它的 JSF 委托(delegate)者 ExternalContext#getRealPath()
)将返回 null
当 servlet 容器配置为在 RAM 内存空间而不是本地磁盘文件系统空间中扩展部署的 WAR 时。众所周知,“重型”服务器这样做是为了提高性能。由于没有任何物理本地磁盘文件系统路径可供您在 File
中进一步利用。或FileInputStream
, null
将会被退回。
getRealPath()
对于获取文件内容来说绝对是错误的工具。 Never ever use getRealPath()
。您应该使用 ServletContext#getResourceAsStream()
(或其 JSF 委托(delegate)人 ExternalContext#getResourceAsStream()
)。
InputStream content = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/arialuni.ttf");
// ...
请注意,您绝对不应该分配 InputStream
出于显而易见的原因作为静态变量。如果您确实需要,请将其读入 byte[]
首先,以便您可以安全地关闭它。
另请参阅:
关于jsf - 使用 getRealPath() 从 bean 获取文件位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21282920/