Как запретить Grails отображать вид по умолчанию? - PullRequest
0 голосов
/ 19 апреля 2011

Я использую 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 пытается отобразить страницу в конце метода index, потому что я неоднократно получаю следующую ошибку после вызова этого метода ...

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 остановить рендерингчто-нибудь после того, как мой метод завершен?Спасибо, Дэйв

Ответы [ 5 ]

2 голосов
/ 19 апреля 2011

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

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

1 голос
/ 19 апреля 2011

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

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

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

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

0 голосов
/ 03 апреля 2013

попробуйте этот рендер (view: "/ имя страницы", модель: [text: 'hi there')

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

0 голосов
/ 19 апреля 2011

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

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

0 голосов
/ 19 апреля 2011

Я думаю, что вы пытаетесь сделать что-то вразрез с дизайном приложения 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...