【发布时间】:2013-01-07 05:13:58
【问题描述】:
我正在尝试显示在新浏览器窗口中打开的内联 PDF。我有以下情况:
- 在一些由 ajax 调用的 ActionListen 中,我生成 PDF 内容,将数据放入会话中,并发送要执行的 Javascript(
window.open打开新页面以显示 PDF) -
在打开的页面上,我在
h:body内只有p:media标记,其值指向StreamedContent:
现在,在该页面上没有生成我的 PDF。在日志中我可以看到这两行:
org.primefaces.application.PrimeResourceHandler handleResourceRequest
SEVERE: Error in streaming dynamic resource. Expression cannot be null
我开始调试并发现了一些东西。
首先,我在RequestScoped bean 的@PostConstruct 方法中添加了断点。有趣的是断点到达了两次,并且在完美显示 PDF 之后让我大吃一惊?!
通过PrimeResourceHandler进行一些调试后,我发现在某些情况下ValueExpression没有计算出来,实际上它抛出了NullPointerException,再次在调试时我看到发送了两个请求,第二个请求失败了,因为@ 987654333@ 在第一个请求中被删除,第二次调用 handleResourceRequest 没有意义。
通过 Firebug 我可以看到两个请求,第一个是 PDF 数据,第二个也是内容类型 application/pdf 但为空,大小为 0。
xhtml 页面:
<html>
<h:head></h:head>
<h:body>
<p:media value="#{reportBean.streamedContent}" player="pdf" width="500" height="500"/>
</h:body>
</html>
支持 bean:
@RequestScoped
public class StampaListeBackingBean implements Serializable {
private static final long serialVersionUID = 1L;
private StreamedContent streamedContent;
@PostConstruct
public void init() {
Map<String, Object> session = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
byte[] b = (byte[]) session.get("reportBytes");
if (b != null) {
streamedContent = new DefaultStreamedContent(new ByteArrayInputStream(b), "application/pdf");
}
}
public StreamedContent getStreamedContent() {
if (FacesContext.getCurrentInstance().getRenderResponse()) {
return new DefaultStreamedContent();
} else {
return streamedContent;
}
}
public void setStreamedContent(StreamedContent streamedContent) {
this.streamedContent = streamedContent;
}
}
我需要了解为什么在带有p:media 标记的页面上发送两个请求,并弄清楚如何使其工作。支持 bean 是请求范围的,它在 @PostConstruct 方法中创建 StreamedContent,并具有该字段的 getter 和 setter。 Primefaces 版本是 3.4.2,Mojarra 是 2.1.14。
添加:
很容易重现我的问题。如果init 方法中的代码替换为以下代码:
FileInputStream fis = new FileInputStream(new File("C:\\samplexxx.pdf"));
streamedContent = new DefaultStreamedContent(fis, "application/pdf");
问题可以重现。
【问题讨论】:
-
关于观察到的 bean 行为,这是从
<p:graphicImage>知道的,并在此处详细回答:stackoverflow.com/questions/8207325/… 至于观察到的异常,抱歉,不知道。一些具体的代码会有所帮助。 -
@BalusC 我添加了xhtml和java代码,很简单。我还添加了 Firebug 的检查。
-
如果你使用像
<p:media value="some.pdf">这样的静态路径呢?只是为了排除资源 servlet 的原因。 PrimeFaces 自己的展示示例怎么样?它也适合你吗?只是为了排除浏览器的原因(它对我有用)primefaces.org/showcase-labs/ui/media.jsf -
@BalusC 它运行良好。 Primefaces 示例也可以正常工作。但正如我所见,他们在所有示例中也使用静态路径。我还尝试了不同范围的 bean,但没有帮助。
标签: pdf jsf-2 primefaces stream media