新しいブラウザウィンドウで開いたインラインPDFを表示しようとしています。私は次のシナリオを持っています:
- ajaxによって呼び出される一部のActionListenでは、PDFコンテンツを生成し、データをセッションに入れ、実行するJavascriptを送信します(
window.open
PDFを表示するために新しいページを開くため) 開いたページには、値が指す
p:media
タグが含まれています。h:body
StreamedContent
さて、そのページでは私のPDFは生成されません。ログには、次の2行が表示されます。
org.primefaces.application.PrimeResourceHandler handleResourceRequest
SEVERE: Error in streaming dynamic resource. Expression cannot be null
私はデバッグを開始し、いくつかのことを見つけました。
まず、Bean@PostConstruct
のメソッドにブレークポイントを追加しました。RequestScoped
興味深いのは、ブレークポイントに2回到達したことです。その後、PDFが完全に表示されたので、驚いたことになります。
いくつかのデバッグをPrimeResourceHandler
行った後、場合によってValueExpression
は計算されないことがわかりました。実際にはがスローされますNullPointerException
。また、デバッグ中に2つのリクエストが送信dynamicContentId
され、最初のリクエストで削除されたために2番目のリクエストが失敗し、2番目の呼び出しはhandleResourceRequest
失敗することがわかりました。意味があります。
Firebugを介して、2つのリクエストを確認できます。1つはPDFデータに適しています。もう1つはコンテンツタイプの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>
バッキングビーン:
@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;
}
}
2つのリクエストがp:media
タグ付きのページで送信される理由を理解し、これを機能させる方法を理解する必要があります。バッキングBeanはリクエストスコープであり、メソッドで作成StreamedContent
され@PostConstruct
、そのフィールドにゲッターとセッターがあります。Primefacesのバージョンは3.4.2で、Mojarra2.1.14を使用しています。
追加した:
私の問題を再現するのは簡単です。メソッド内のコードがinit
次のように置き換えられた場合:
FileInputStream fis = new FileInputStream(new File("C:\\samplexxx.pdf"));
streamedContent = new DefaultStreamedContent(fis, "application/pdf");
問題を再現できます。