[Seasar-user:9166] Re: [Teeda] ダウンロード時に発生するIllegalStateExceptionに

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2007年 7月 13日 (金) 17:41:40 JST


原田です。お世話になっております。

下記の件、うまく行きました。ありがとうございます。

元々は、下記のソースのようにDIされたものではなく
FacesContextを取得してやっていたのですが、これに
問題があったという認識でよいでしょうか?
つまり、responseCompleteを発行する場合は、Seasar2では
DIされたFacesContextに対してresponseCompleteを
発行しなければならないとなる認識になるのかと。

--------ソース---------
// FacesContextからresponse取得
FacesContext fctx = FacesContext.getCurrentInstance();
ExternalContext ectx = fctx.getExternalContext();
HttpServletResponse res = (HttpServletResponse) ectx.getResponse();

// コンテキストタイプの設定
res.setContentType(contentType);

// ファイル名設定
StringBuffer attachment = new StringBuffer();
attachment.append("attachmenter;filename=");
attachment.append(fileName);
res.setHeader("Content-Disposition", attachment.toString());

// 出力領域の設定
ServletOutputStream outData = res.getOutputStream();

// ファイルのバイナリ取得
byte[]  fBuf = new byte[4096];
int     readLen = 0;

// ファイルを読込みレスポンスに書き込み
while ((readLen = in.read(fBuf)) != -1) {

    outData.write(fBuf, 0, readLen);
}
outData.flush();
outData.close();

fctx.responseComplete();

以上


>ひがです。
>> 
>> 本件ですが、すでにresponseCompleteは呼び出しています。
>> ただし、JSF仕様で、FacesContextをDIせずにやっていたため
>> ひがさんが言うようにDIしたfacesContextに対して
>> responseCompleteをやってみましたがIllegalStateExceptionが
>> 発生しました。
>> 
>LifecycleImplの124行目を見るとわかりますが、
>responseComplieteが呼び出されていれば、レンダリングや
>フォワードは行われないはずです。
>
>FacesContextのresponseCompleteがTeedaが認識できる形で
>呼び出されていないのではないかと思います。
>
>実はスレッドが違うとか、違うリクエストでresponseCompleteを
>呼び出しているとか。
>ダウンロードしたスレッドでresponseCompleteを呼び出せば
>大丈夫なはずです。
>
>--
>Yasuo Higa
>[E-MAIL ADDRESS DELETED]
>_______________________________________________
>Seasar-user mailing list
>[E-MAIL ADDRESS DELETED]
>https://ml.seasar.org/mailman/listinfo/seasar-user
>



Seasar-user メーリングリストの案内