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

标签 jsf netbeans primefaces weblogic

我在从 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/

相关文章:

PrimeFaces progressBar 不更新状态

html - 如何在对话框窗口中覆盖 primefaces 中的主题并设置用户定义 CSS

java - JBoss AS 7.1.1 没有获取我的 JSF 实现

java - NetBeans 的启动画面功能如何工作?

java - 使用ajax更新另一个字段

c++ - 存在 Windows 时未找到 Python.h

c++ - gdb/solaris : When attaching to a process, 符号未加载

jsf - 使用 Servlet 3.0 以编程方式控制登录

ajax - 使用AJAX更新JSF/Primefaces数据表中的单行

java - 如何将单个文件从 CVS 导入到项目中