1

Webアプリケーションに簡単なグラフを表示したいので、JFreeChartをSpringMVCに統合することにしました。私は次の解決策を見つけました:

@RequestMapping("/seeGraph")
    public String drawChart(HttpServletResponse response) {

        response.setContentType("image/png");
        XYDataset pds = createDataset();
        JFreeChart chart = createChart(pds);
        try {
            ChartUtilities.writeChartAsPNG(response.getOutputStream(), chart, 600, 400);            
            response.getOutputStream().close();

        } catch (Exception e) {

        }
        return "graph";
    }

これは良くないと思います。グラフは表示されますが、例外もスローされます。

getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response.

調査を行ったところ、アプリケーションは任意の応答に対してgetOutputStreamまたはgetWriterのいずれかを呼び出すことができ、両方を行うことは許可されていないことがわかりました。

しかし、ChartUtilities.writeChartAsPNG()のため、getOutputstreamを呼び出す必要があり、SpringはgetWriter()を呼び出します。

この例外を回避するための賢い解決策はありますか?

4

1 に答える 1

1

現在、コントローラーメソッドの実行後に呼び出されるビューをレンダリングするようにSpringに依頼しますgraph(メソッドからビュー名を返すことにより)。ただし、コントローラー内の出力にデータを書き込む場合は、ビュー レンダリング フェーズに進むべきではありません。

voidしたがって、代わりにメソッドを使用する必要があります。

@RequestMapping("/seeGraph")
public void drawChart(HttpServletResponse response) { ... }
于 2012-09-21T16:00:45.280 に答える