Grails перенаправляет на неправильный адрес при использовании app.context? - PullRequest
5 голосов
/ 03 ноября 2011

Я заметил странное поведение с redirect, когда я установил app.context определенным образом. Я нашел ошибку в Grails JIRA, которая отлично описывает мою проблему, но она была помечена как UTR: http://jira.grails.org/browse/GRAILS-7546


Вот мое описание проблемы:
В настоящее время я использую Grails 2.0M2. В моем файле application.properties определены следующие свойства:

app.context=/
app.name=foobar

Когда я вызываю redirect в контроллере, redirect добавляет имя приложения к указанному мною uri, что затем вызывает 404. Вот как я это делаю:

String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
redirect(uri: partialUrl) // INCORRECTLY redirects to 
                          // `http://mysite.com/foobar/hello/world`
                          // instead of `http://mysite.com/hello/world`

Предположим, что в моем файле UrlMappings.groovy определен URL-адрес с именем helloworld с путем /hello/world.

Итак, короче говоря, если бы я установил app.context на /, я бы НЕ ожидал, что app.name появится в моем окончательном URL перенаправления.

Это ошибка или ожидаемое поведение? Есть идеи, как проще всего создать URL перенаправления, не выполняя слишком много ручных шагов?

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

Мне неприятно это говорить, но я также не могу воспроизвести это. Я создал тестовый проект с одним контроллером (с именем Hello), используя ваш код для создания действия, которое не выполняет ничего, кроме перенаправления:

HelloController.groovy

package test1

class HelloController {
   def index() {
      def model = [:]
      model.content = 'content...'
      model
   }

   def redir() {
      String partialUrl = createLink(mapping: 'helloworld') // returns `/hello/world`
      redirect(uri: partialUrl) // INCORRECTLY redirects to 
                            // `http://mysite.com/foobar/hello/world`
                            // instead of `http://mysite.com/hello/world`
   }
}

Я создал индексную страницу index.gsp в views / hello

index.gsp

<h1>index.gsp</h1>
<html>
   <body>
      <p>This data is coming from the model:</p>
      <p>content: ${content}</p>
   </body>
</html>

Настройте helloworld в UrlMappings для сопоставления с действием index контроллера hello:

UrlMappings.groovy

class UrlMappings {
    static mappings = {
        "/helloworld"(controller: "hello", action: "index")

        "/$controller/$action?/$id?"{
            constraints {
                // apply constraints here
            }
        }

        "/"(view:"/index")
        "500"(view:'/error')
    }
}

И изменил application.properties, чтобы app.context = /

application.properties

#Grails Metadata file
#Sun Nov 06 14:51:56 EST 2011
app.grails.version=2.0.0.RC1
app.context=/
app.name=test1
app.servlet.version=2.5
app.version=0.1

Когда я запускал приложение, я мог перейти на localhost: 8080 / hello, и он показал бы мой простой GSP. Я попробовал localhost: 8080 / helloworld и также получил его, как и ожидалось в соответствии с отображением. Затем я попробовал localhost: 8080 / hello / redir, и я был правильно перенаправлен на localhost: 8080 / helloworld.

Однако, если вы все еще сталкиваетесь с этой проблемой, у меня есть несколько предложений 1) Попробуйте использовать новый генератор ссылок, доступный в 2.0, вместо createLink. Это не может сделать что-то другое, но стоит попробовать: grailsLinkGenerator.link(mapping: 'helloworld') 2) Если это происходит только при перенаправлениях из контроллеров, вы можете просто добавить часть http://mysite.com в partUrl. 3) В крайнем случае, напишите фильтр, прикрепленный к afterView, который выполняет поиск по регулярному выражению и заменяет содержимое для mysite.com/foobar. Не уверен, что это перехватит перенаправления, но если что-то случится, я бы предположил, что так оно и будет, поскольку фильтры могут применяться на широком уровне.

1 голос
/ 11 ноября 2011
  def yourAction = {

       redirect(uri:"helloworld")

  }

Это не работает для вас?

0 голосов
/ 03 ноября 2011

Это не прямой ответ на ваш вопрос, но моя практика такова: я никогда не изменяю app.context в свойствах grails, поскольку tomcat переопределяет его в рабочей среде, и мне все равно, какой контекст он использует в моем dev.

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