0

Grailsアプリケーションでopencsvを使用して、PersonドメインクラスからCSVに属性をエクスポートしています。ただし、次のエラーが発生します。

パス[/myapp]のコンテキストでサーブレット[デフォルト]のServlet.service()が例外をスローしました[リクエスト処理に失敗しました。ネストされた例外は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()
        }

    }
4

2 に答える 2

1

あなたの問題はおそらく、コントローラーの出力ストリームに明示的に書き込んでから、アクションから戻ったときに GSP レンダリングのデフォルトの動作が続くことに起因します。Grails がデフォルト ビューをレンダリングしないようにする方法をチェックしてみてください。この別のケースでは、いくつかの修正があります。問題を再現するために現在使用しているマシンに grails はありませんがreturn null、クロージャの最後に明示的に to を追加すると役立つようです。または、 を介して何らかのトークン出力または 200 ステータス コードを生成しrenderます。

于 2012-11-02T19:18:22.993 に答える