Spring mvc 将JFreeChart与SpringMVC集成会引发异常:已为此响应调用getOutputStream()

Spring mvc 将JFreeChart与SpringMVC集成会引发异常:已为此响应调用getOutputStream(),spring-mvc,jfreechart,Spring Mvc,Jfreechart,我想在我的Web应用程序中显示一个简单的图形,所以我决定将JFreeChart集成到SpringMVC中。 我找到了以下解决方案: @RequestMapping("/seeGraph") public String drawChart(HttpServletResponse response) { response.setContentType("image/png"); XYDataset pds = createDataset();

我想在我的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()


有什么聪明的解决方案可以避免这种异常吗?

目前,您要求Spring在执行控制器方法后(通过从方法返回视图名称)呈现一个名为
graph
的视图。但是,如果将数据写入控制器内的输出,则不应继续查看渲染阶段

因此,您需要使用
void
方法:

@RequestMapping("/seeGraph")
public void drawChart(HttpServletResponse response) { ... }

当前,在执行控制器方法后(通过从方法返回视图名称),要求Spring呈现名为
graph
的视图。但是,如果将数据写入控制器内的输出,则不应继续查看渲染阶段

因此,您需要使用
void
方法:

@RequestMapping("/seeGraph")
public void drawChart(HttpServletResponse response) { ... }