0

我在我的 Grails 应用程序中使用opencsv将属性从我的 Person 域类导出到 CSV。但是,我收到以下错误:

Servlet.service() for servlet [default] 在上下文中与路径 [/myapp] 引发异常 [请求处理失败;嵌套异常是 org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: Error processing GroovyPageView: getOutputStream() has already been called for this response] with root cause Message: getOutputStream() has already been called for this response

通过在线搜索,我认为答案可能是在某处为 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()
        }

    }
4

2 回答 2

1

您的问题可能源于显式写入控制器中的输出流,然后是从您的操作返回时 GSP 呈现的默认行为。您可以检查如何防止 Grails 呈现默认视图?对于这种情况的另一种情况,有几个修复。我目前正在使用的机器上没有 grails 来重新创建问题,但听起来像return null在关闭结束时添加显式 to 可能会有所帮助。或通过生成一些令牌输出或 200 状态代码render

于 2012-11-02T19:18:22.993 回答
0

您必须通过 String[] properties = new String[9] 更改此属性 String[] properties = new String[3]。

这个对我有用。

于 2013-10-25T13:26:39.657 回答