2016-09-01 10 views
1

ここでは、Struts2を使用してアプリケーションの新しい機能を開発しています。新しいアクションを追加してCSVファイルを生成しました。すべてはTomcatで私のテスト・システム上で正常に動作しますが、WebSphereサーバーと品質システムに、ファイルはOKですが、最後に、そうなものは、ファイルが生成されレスポンスにWebsphere appendingエラーが発生しました

Error 500: java.lang.IllegalStateException: Response already committed. 

含む余分な行がありますすべてが完璧ですが、Tomcatはエラーを追加しません.Websphereはエラーを追加します。

どうすればこの問題を回避できますか? ここではメイン処理(重要なライン):

1-アクションが転送を行いorg.apache.struts2.s1.Struts1Actionを拡張:アクションで

ActionForward forward = action.execute(mapping, actionForm, request, response); 

2-方法であります

response.setContentType("text/csv"); 
response.setHeader("Content-Disposition", "attachment; filename=\"report_" 
       + Calendar.getInstance().get(Calendar.YEAR) + ".csv\""); 
OutputStream outputStream = response.getOutputStream(); 
outputStream.write(result.toString().getBytes()); 
outputStream.flush(); 
outputStream.close(); 

3次の行で応答を生成します。ある時点で、私はこの例外を取得するが、それは(私たちはすでにエクセルレポート(XLS)の他の種類を生成しますが、応答にエラーを追加のWebSphereでこの問題をやったことがなかった)私たちを心配したことがない:

java.lang.IllegalStateException:getOutputStream() has already been called for this response 

ですから、本当に私に不思議なのはwebsphereにcsvファイルにエラーを追加するのを避ける方法です...しかしもちろんソリューションはエラーを避けるべきですが、このアプリケーションは10年間実行されていて、すでに動作しているものを変更してください。ただし、このエラーに対する解決策は大歓迎です!!

大変ありがとうございます。

---編集---私が実際に知りたい

何を、私はテキストファイルで応答を生成し、まだすべての転送やものを行うことがその後できることができる方法です。

アイデア?ただ、あなたにいくつかのアイデアを与えるためにしようと

答えて

0

実際、私は実際にこの問題の解決策を見つけましたが、それ自体では解決策ではないかもしれませんが、回避策がありました。

Responseのコンテンツが単なる文字列だったので、websphereがエラーを追加していたという問題がありました。

私がしたことは、文字列ではなくByteArrayとしてレスポンスを生成していました。このようにWebsphereでは単純なテキストとして何も追加できず、ByteStreamは閉じられて安全です。

 byte[] data = result.toString().getBytes(); 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(data.length); 
     outStream.write(data, 0, data.length); 
     response.setContentType("text/csv" + "; charset=UTF-8"); 
     response.setHeader("Expires", "0"); 
     response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
     response.setHeader("Pragma", "public"); 
     response.setHeader("Content-Disposition", "attachment; filename=\"report_" 
        + Calendar.getInstance().get(Calendar.YEAR) + ".csv\""); 

     response.setContentLength(outStream.size()); 
     ServletOutputStream responseOutStream = response.getOutputStream(); 
     outStream.writeTo(responseOutStream); 
     outStream.flush(); 
     outStream.close(); 
     responseOutStream.flush(); 
     responseOutStream.close(); 

十分に説明していないと、編集、提案または説明が歓迎です。

1

...以下は理にかなって願っています...

まず第一に、このsourceに応じjava.lang.IllegalStateException:getOutputStream()の原因が短い、このエラーで

ですあなたはインクルードが前方に含める()またはレスポンスをコミットした後、またはレスポンス・オブジェクトに のgetOutputStream()を呼び出すことによって() メソッドを呼び出したときに来て

Hereは、struts1のダウンロード実装の例です(理解していますが、struts2用のstruts1プラグインを使用しています)。そこではメソッドの最後がreturn null;

であることがわかります。あなたの投稿から省略したコードでは、例外が発生する可能性があります。

+0

実際これはエラーである可能性があります。しかし、私はすでにそれをやっています。もしnullを返さなければ、うまくいきません。しかし、私が推測することは、ファイルを使って応答を正しく生成して、転送や必要なものすべてをやりなおすことができることを実現することです。私が多くのコードを投稿していないのは、それを許可されていないからです。だから、私が言うことができる「一般的なもの」を投稿しているだけです。とにかくありがとう。私はそれをもう一度見せます。 – Carloshf

+0

@Carloshf私が実際に心配していたのは、あなたが 'ヌルを返さず、代わりに'転送 'をしないということでした。しかし、コードの残りの部分がないと、何が間違っているのかを理解することは難しいです。すぐに解決策を見つけることを願っています... – Plirkee

関連する問題