基于Spring-MVC-Java的配置:已经为此响应调用了getOutputStream()

时间:2013-01-18 23:26:10

标签: spring spring-mvc freemarker spring-3

我在Spring 3中使用基于Java的配置。

我有一个模块可以将Excel工作表导出到用户(即将工作表下载到用户)

我在日志中遇到以下异常......但导出正常:

  

java.lang.IllegalStateException:getOutputStream()已经存在   呼吁这个回应                   在org.apache.catalina.connector.Response.getWriter(Response.java:639)                   在org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)                   在javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)                   在javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)                   在org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366)                   在org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283)                   在org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233)                   在org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)                   在org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)                   在org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1157)                   在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:927)                   在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)                   在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)                   在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)                   在javax.servlet.http.HttpServlet.service(HttpServlet.java:621)                   在javax.servlet.http.HttpServlet.service(HttpServlet.java:728)                   在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)                   在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)                   在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:311)                   在org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)                   在org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)                   在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)                   在org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)                   在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)                   在org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101)                   在org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:323)

经过调查,我发现getOutputStream()方法只能在响应上调用一次。 但是,每次用户需要导出工作表时,我都会调用它:

public void exportExcel(HttpServletResponse response) throws Exception {

    response.setContentType("application/vnd.ms-excel");

    response.setHeader("Content-disposition", "attachment;filename=" + sheetName + "");


    ByteArrayOutputStream excelFileByteArrayOutputStream =

    excelFileByteArrayOutputStream.writeTo(response.getOutputStream());
    excelFileByteArrayOutputStream.flush();
    response.flushBuffer();
    excelFileByteArrayOutputStream.close();
  }

Freemarker配置:

@Bean
  public FreeMarkerViewResolver viewResolver() {
    FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
    freeMarkerViewResolver.setCache(true);
    freeMarkerViewResolver.setPrefix("");
    freeMarkerViewResolver.setSuffix(".ftl");
    return freeMarkerViewResolver;
  }

  @Bean
  public FreeMarkerConfigurer freemarkerConfig() {
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
    freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/freemarker/");
    Properties settings = new Properties();
    settings.setProperty("number_format", "0.######");
    freeMarkerConfigurer.setFreemarkerSettings(settings);
    Map variables = new java.util.HashMap<String, Object>();

    variables.put("xml_escape", new XmlEscape());
    freeMarkerConfigurer.setFreemarkerVariables(variables);
    return freeMarkerConfigurer;
  }

@Controlle ...导出工作表后,它永远不会像我指定的那样重定向到主页:

  @RequestMapping(value = "/smth", method = RequestMethod.GET)
  public ModelAndView exportSheet(HttpServletResponse response,
                                                           Bean aBean,
                                                           BindingResult result) throws Exception {

//Some Code
    return new ModelAndView("/home");
  }

我的WebApplicationInitializer:

public class SpringWebApplicationInitializer implements WebApplicationInitializer {

  @Override
  public void onStartup(final ServletContext servletContext) throws ServletException {

    // Create the 'root' Spring application context
    AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
    rootContext.register(WebConfiguration.class);

    // Manage the lifecycle of the root application context
    servletContext.addListener(new ContextLoaderListener(rootContext));

    // Create the dispatcher servlet's Spring application context
    AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
    dispatcherContext.register(DispatcherConfiguration.class);

    // Register and map the dispatcher servlet
    ServletRegistration.Dynamic dispatcher =
      servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/");

    // Register Spring Security Filter
    DelegatingFilterProxy securityFilter = new DelegatingFilterProxy();
    FilterRegistration.Dynamic securityFilterRegistration =
      servletContext.addFilter("springSecurityFilterChain", DelegatingFilterProxy.class);
    securityFilterRegistration.addMappingForUrlPatterns(null, false, "/*");
  }


}

任何想法如何解决这个问题!

0 个答案:

没有答案
相关问题