Grails - предыдущий вызов перенаправления (..) уже перенаправлен - PullRequest
8 голосов
/ 27 апреля 2011

В приложении Grails иногда появляется сообщение «Не удается выполнить перенаправление» в журналах:

2011-04-27 12: 18: 40,469 [TP-Processor13] ОШИБКА GrailsExceptionResolver - здесь невозможно выполнить перенаправление (..). Предыдущий вызов перенаправления (..) уже перенаправил ответ. org.codehaus.groovy.grails.web.servlet.mvc.exceptions.CannotRedirectException: Невозможно выполнить перенаправление (..) здесь. Предыдущий вызов перенаправления (..) уже перенаправил ответ. на com.coach.LoginController $ _closure2.doCall (LoginController.groovy: 90) ...

Не уверен, как отследить это. Есть идеи или предложения?

Todd

Ответы [ 3 ]

17 голосов
/ 28 апреля 2011

Проверьте контроллер входа в систему; кажется, что вы не возвращаетесь из действия после перенаправления. * 1002 Е.Г. *:

if (some condition) {
    redirect ()
    return  // should return from here to finish the action, otherwise the rest of the code will be executed
}
3 голосов
/ 07 марта 2013

Хотя на этот вопрос был дан ответ, я решил поделиться своим опытом для будущих траулеров. Надеюсь, это поможет.

Это случилось со мной, потому что я не делал return после перенаправления:

    if (test) {
        flash.message = "Error message."
        redirect(action: "list")
    }

    switch ( params.test ) {
        case "value": 
            redirect(action: "value", id: callInstance.id, version: callInstance.version)

После перенаправления Grails продолжит работу, если нет return. В моем случае он нажал switch и перешел ко второму перенаправлению, где возникла ошибка. Код должен выглядеть следующим образом:

    if (test) {
        flash.message = "Error message."
        redirect(action: "list")
        return
    }

    switch ( params.test ) {
        case "value": 
            redirect(action: "value", id: callInstance.id, version: callInstance.version)
            return

Этот код, конечно, был анонимным;)

EDIT

О боже. Я только что понял, что это ответ Sachin : / Ну, я оставлю это в качестве дополнительного примера.

1 голос
/ 26 февраля 2013

Вы можете перенаправить только один раз. Если вы переходите от метода контроллера A -> B -> C, B действительно должен быть сервисным методом, который затем передает свои результаты в метод контроллера C, а не метод контроллера.

class TemplateController {
  def templateService

  def A() {
    def results = templateService.B(params.input)

    redirect action: 'C', params: ['results': results]
  }

  def C() {
    return params.results
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...