DB データから CSV ファイルを作成し、Spring MVC コントローラー (および関連サービス) からクライアントに送信しようとしています。書き込みと出力を処理するために SuperCSV を使用しています: http://supercsv.sourceforge.net/
したがって、コントローラーメソッドは次のとおりです。
@RequestMapping(value="/getFullReqData.html", method = RequestMethod.GET)
public void getFullData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException{
logger.info("INFO: ******************************Received request for full Req data dump");
List<Requirement> allRecords = reqService.getFullDataSet(ProjectService.getProjectID((String)session.getAttribute("currentProject")));
response.setContentType("text/csv;charset=utf-8");
response.setHeader("Content-Disposition","attachment; filename=nistData.csv");
OutputStream fout= response.getOutputStream();
OutputStream bos = new BufferedOutputStream(fout);
OutputStreamWriter outputwriter = new OutputStreamWriter(bos);
ICsvBeanWriter writer = new CsvBeanWriter(outputwriter, CsvPreference.EXCEL_PREFERENCE);
try {
final String[] header = new String[] {
"ReqID",
"ColName1",
"ColName2",
"ColName3",
"ColName4",
"ColName5",
"ColName6",
"ColName7",
"ColName8",
"ColName9",
"ColName10" };
// the actual writing
writer.writeHeader(header);
for(Requirement aCR : allRecords){
writer.write(aCR, header);
}
} finally {
writer.close();
}
};
これは実際に前進し、csv ファイルのダウンロードをトリガーするクライアント ブラウザーへの応答を取得しています。
2 つの問題:
1) サーバー側の例外が山積みになっています (以下)。
2) allRecords リストがデバッガーに完全に入力されているように表示されているにもかかわらず、CSV ファイルにはヘッダーのみが含まれ、データはありません。
例外が原因で入力に失敗したことを願っていますが、疑わしいです。例外トレース:
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:633)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:182)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:123)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
at org.apache.jsp.error_jsp._jspService(error_jsp.java:102)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
このメソッドの呼び出しごとに 4 回例外が発生しているため、例外が渡されるようです。
私が見つけたすべてのドキュメントには、サーブレットではなくスクリプトレット内に response.getOutputStream() を埋め込んでいる人がいます。上記で取り上げたメソッドはSpring MVCコントローラー内にあるため、「サーブレットに移動してください!」というアドバイスです。ここには当てはまらないようです。私が知る限り、response.getOutputStream() を呼び出しているのは 1 回だけで、メソッドは最初の呼び出しで失敗しています。
私は困惑しています。ヘルプ?