Ошибка Grails при использовании HttpServletResponse для экспорта файла для загрузки

Я использую opencsv в своем приложении Grails для экспорта атрибутов из моего доменного класса Person в CSV. Однако я получаю следующую ошибку:

Servlet.service() для сервлета [по умолчанию] в контексте пути [/myapp] выдал исключение [Ошибка обработки запроса; вложенным исключением является org.codehaus.groovy.grails.web.pages.exceptions.GroovyPagesException: ошибка обработки GroovyPageView: getOutputStream() уже был вызван для этого ответа] с основной причиной Сообщение: getOutputStream() уже был вызван для этого ответа

Из поиска в Интернете я думаю, что ответ может состоять в том, чтобы реализовать какой-то метод responseComplete() где-нибудь для ответа HttpServletResponse. Однако я не уверен, как это сделать. Любые идеи? Вот мой код:

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()
        }

    }

person littleK    schedule 01.11.2012    source источник
comment
У вас где-нибудь вызывается render или redirect (это вне приведенного выше кода)?   -  person Jon Burgess    schedule 02.11.2012
comment
Попробуйте использовать шаблон gsp для CSV и стандартную модель, заполненную данными.   -  person Tom Metz    schedule 02.11.2012
comment
Поскольку я немного новичок в Grails, я не уверен, что вы имеете в виду, когда говорите о шаблоне gso для CSV. Можете ли вы немного уточнить или указать пример? Спасибо!   -  person littleK    schedule 02.11.2012


Ответы (2)


Ваша проблема, вероятно, связана с явной записью в поток вывода в вашем контроллере, за которой следует поведение по умолчанию рендеринга GSP после возврата из вашего действия. Вы можете проверить Как запретить Grails отображать представление по умолчанию? для другого случая с парой исправлений. У меня нет Grails на машине, на которой я сейчас нахожусь, чтобы воссоздать проблему, но похоже, что добавление явного return null в конец закрытия может помочь. Или создание некоторого вывода токена или кода состояния 200 через render.

person Brian Henry    schedule 02.11.2012

Вы должны изменить это свойство String[] properties = new String[3] на String[] properties = new String[9].

Меня устраивает.

person user2068981    schedule 25.10.2013