2012-11-01 40 views
0

我在我的Grails應用程序中使用opencsv將屬性從我的Person域類導出到CSV。但是,我收到以下錯誤:使用HttpServletResponse導出文件進行下載的Grails錯誤

servlet.service()for servlet [default]在上下文中使用path [/ myapp]拋出異常[Request processing failed;嵌套的異常是org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException:處理GroovyPageView時出錯:getOutputStream()已被調用此響應],其根本原因 消息:getOutputStream()已被調用此響應

從在線搜索中,我認爲答案可能是爲HttpServletResponse響應實現某個responseComplete()方法。但是,我不知道如何做到這一點。有任何想法嗎?這裏是我的代碼:

def export = { 
    def course = Course.get(params.id) 
    if(course){ 
     def persons = course ? Person.findAllByCourse(course) : [] 


     response.setHeader("Content-disposition", 
      "attachment; filename=people.csv") 
     response.contentType = "text/csv" 
     def out = response.outputStream 
     out.withWriter { writer -> 

      String[] properties = new String[3] 
      def csvWriter = new CSVWriter(writer) 
      persons.each { person -> 

       properties[0] = person.firstName 
       properties[1] = person.lastName 
       properties[2] = person.email 
       properties[3] = person.phone 
       properties[4] = person.address1 
       properties[5] = person.address2 
       properties[6] = person.city 
       properties[7] = person.state 
       properties[8] = person.zip5 

       csvWriter.writeNext(properties) 
      } 
      csvWriter.flush() 
     } 

    } 
+0

你有沒有在任何地方調用'render'或'redirect'(這是在上面的代碼之外)? –

+0

不,我不... – littleK

+0

嘗試使用充滿數據的CSV和標準模型的gsp模板。 –

回答

1

你的問題可能是由明確寫在你的控制器輸出流,其次是GSP渲染在從你的行動返回的默認行爲造成的。您可能會檢查How to prevent Grails from rendering the default view?另一個這種情況,有幾個修復程序。我目前正在使用的機器上沒有grails來重新創建問題,但聽起來像在關閉結束時添加明確的return null可能會有所幫助。或者通過render產生一些令牌輸出或200狀態碼。

0

您必須通過String [] properties = new String [9]更改此屬性String [] properties = new String [3]。

它適用於我。

相關問題