1

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 回だけで、メソッドは最初の呼び出しで失敗しています。

私は困惑しています。ヘルプ?

4

2 に答える 2

7

あなたのフローはおそらくリクエストマップメソッドのどこかで例外を発生させています-おそらくwriter.write(aCR, header);それはfinallyブロックに行き、応答ストリームを閉じ、そして例外はサーブレットにバブルアップし、エラーページでそれを処理しようとします( web.xmlerror-pageタグ)。これは、応答ストリームが閉じているため、エラーjspをクリーンにレンダリングできないため、表示されている例外メッセージです。

コントローラ内で例外をキャッチし、スタックトレースを出力して、出力ストリームへの書き込み中にコントローラで何が問題になっている可能性があるかを確認できれば便利です。

于 2012-09-07T21:14:49.963 に答える
0

代わりにprintWriterで動作させることができますか:

    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + ".xls\"");
    PrintWriter out = response.getWriter();
于 2012-09-08T01:13:14.953 に答える