2011-04-21 103 views
0

我有一個簡單的Spring MVC Roo生成的應用程序。我試圖讀取XML文件,並返回爲JSON裹在響應POJO,但我發現當使用@ResponseBody返回值時,Spring MVC Roo生成的app :: getOutputStream()已經被調用了這個響應

java.lang.IllegalStateException: getOutputStream() has already been called for this response 

我的代碼是:

@RequestMapping(value="/json/fromxml/{filename}", method=RequestMethod.GET) 
public @ResponseBody Response readXml(@PathVariable("filename") String filename) 
{ 
    Response r = new Response(); 
    String xml =""; 
    try 
    { 
     InputStream is = servletContext.getResourceAsStream("/xml/"+filename+".xml"); 
     if (is != null) { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 
      try { 
       Reader reader = new BufferedReader(
         new InputStreamReader(is, "UTF-8")); 
       int n; 
       while ((n = reader.read(buffer)) != -1) { 
        writer.write(buffer, 0, n); 
       } 
      } finally { 
       is.close(); 
      } 
      xml = writer.toString(); 
     } else {   
      xml = ""; 
     } 


    }catch(Exception e) 
    { 
     r.setStatus(Response.STATUS.ERROR); 
     return r; 
    } 
    JSONObject xmlJSONObject = null; 
    try { 
     xmlJSONObject = XML.toJSONObject(xml); 
    } catch (JSONException e) { 
     r.setStatus(Response.STATUS.ERROR); 
     return r; 
    } 
    r.setStatus(Response.STATUS.OK); 
    r.setBody(xmlJSONObject); 
    return r; 

    /* 
    Response r = new Response(); 
    ServletContextResource resource = new ServletContextResource(servletContext, "/xml/"+filename+".xml"); 
    java.io.File file = null; 
    String xml =""; 
    try 
    { 
     file = resource.getFile(); 
     xml = FileUtils.readFileToString(file); 

    }catch(IOException e) 
    { 
     r.setStatus(Response.STATUS.ERROR); 
     return r; 
    } 
    JSONObject xmlJSONObject = null; 
    try { 
     xmlJSONObject = XML.toJSONObject(xml); 
    } catch (JSONException e) { 
     r.setStatus(Response.STATUS.ERROR); 
     return r; 
    } 
    r.setStatus(Response.STATUS.OK); 
    r.setBody(xmlJSONObject); 
    return r; 
    */ 
} 

完整堆棧跟蹤:

java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:611) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198) 
    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:188) 
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118) 
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77) 
    at org.apache.jsp.WEB_002dINF.layouts.default_jspx._jspService(default_jspx.java:83) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.forward(ServletTilesRequestContext.java:241) 
    at org.apache.tiles.servlet.context.ServletTilesRequestContext.dispatch(ServletTilesRequestContext.java:222) 
    at org.apache.tiles.renderer.impl.TemplateAttributeRenderer.write(TemplateAttributeRenderer.java:44) 
    at org.apache.tiles.renderer.impl.AbstractBaseAttributeRenderer.render(AbstractBaseAttributeRenderer.java:106) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:670) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:690) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:644) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:627) 
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:321) 
    at org.springframework.web.servlet.view.tiles2.TilesView.renderMergedOutputModel(TilesView.java:124) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:662) 
+0

您可以評論其他人的答案。爲你添加最後的評論。 – 2011-04-22 15:25:22

+0

我想我縮小了它。如果我做r.setBody(xmlJSONObject.toString())它可以工作,但是我的身體是一個轉義字符串。我不知道如何解決這個問題。 – alexmnyc 2011-04-22 18:23:57

回答

0

嘗試返回JSONObject作爲響應正文。如果您需要設置響應狀態,請獲取響應對象。您的方法的簽名可能看起來像這樣:

@RequestMapping(value="/json/fromxml/{filename}", method=RequestMethod.GET) 
public @ResponseBody JSONObject readXml(@PathVariable("filename") String filename, HttpServletResponse response) { 
    ... 
    response.setStatus(status); 
    ... 
} 
+0

來自@alexm:_「@ Infeligo,你是說這是一個命名衝突?」_ – 2011-04-22 15:24:33

相關問題