Как запретить Grails отображать представление по умолчанию?

Я использую Grails 1.2.1. У меня есть этот метод в моем контроллере...

class SocialMediaCacheProxyController {

    def index = {       
        def url = params.url
        if (params.dumpAll != null) {
            transportCacheService.processCacheDump(request.getRemoteAddr(), response)
        } else if (url != null) {
            doCacheTransport(request, response)
        }   // if
    }

Проблема заключается в том, что оба пути выполнения записывают контент в ответ. Тем не менее, я думаю, что Grails пытается отобразить страницу в конце метода индекса, потому что я неоднократно получаю следующую ошибку после вызова этого метода...

1339754 [http-8080-4] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/socialmediaproxy].[default]  - Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: response.getWriter() called after response.getOutputStream()
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$GrailsBuffer.getWriter(GrailsPageResponseWrapper.java:284)
    at org.codehaus.groovy.grails.web.sitemesh.GrailsPageResponseWrapper$3.activateDestination(GrailsPageResponseWrapper.java:125)

Любые идеи, как я могу заставить Grails прекратить рендеринг всего после моего метода? Спасибо, - Дэйв

Ответ 1

Если вы не скажете Grails, что делать, он будет отображать на основе соглашения. В вашем случае он ищет index.gsp. Контроллеры должны что-то вернуть. Это все. Таким образом, вы можете использовать соглашение и создать возвращаемый индекс .gsp, или вы можете вручную реализовать метод render().

http://grails.org/doc/latest/ref/Controllers/render.html

Ответ 2

Похоже, что большинство кода контроллера, который работает с ModelAndView, следит за тем, было ли <<21 > .

Я бы предположил, что вы могли бы вызвать response.flushBuffer() в конце действия вашего контроллера. Это приведет к тому, что ответ будет отмечен как зафиксированный, и контроллер не вернет ModelAndView.

Альтернативой может быть вызов response.outputStream.flush(), который также приведет к завершению реакции. Это то, что я обычно делаю после ручной работы с ответом (например, для загрузки файлов).

Примечание. Я не уверен, что это входит в сферу "лучших практик" - обычно вы должны полагаться на контейнер для обработки потока сервлетов. Возможно, что это будут непреднамеренные побочные эффекты. Вам, вероятно, придется проверить его и посмотреть, что происходит с вашим приложением и контейнером, в котором вы его запускаете.

Ответ 3

Я думаю, вы пытаетесь что-то противопоставить дизайну приложения MVC. Контроллеры существуют, чтобы отправить вас где-нибудь по параметрам. Возможно, вы могли бы использовать Сервис вместо этого через вызов AJAX. Или, если действие вашего контроллера изменяет данные, которые вы хотите показать, вы можете просто перенаправить обратно на страницу, из которой пришел вызов. Начать здесь:

http://grails.org/doc/1.0.x/guide/6.%20The%20Web%20Layer.html

http://grails.org/doc/1.0.x/guide/8.%20The%20Service%20Layer.html

Ответ 4

Я думаю, что Grails может пересылать index.gsp, потому что он делает это по умолчанию, когда вы не возвращаете значение.

Поэтому я думаю, что вы должны return null в конце закрытия индекса сигнализировать grails, что вы уже написали все, что хотите, к выходному потоку.

Ответ 5

попробуйте это render (view: "/название страницы", модель: [текст: "привет там" )

NB если вы хотите отобразить шаблон вместо "view", вы помещаете "шаблон"