我在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, "/*");
}
}
任何想法如何解决这个问题!