Grails перенаправляет на неправильный адрес при использовании app.context?

#java #model-view-controller #grails #groovy

#java #модель-представление-контроллер #grails #groovy

Вопрос:

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

Вот мое описание проблемы:
В настоящее время я использую Grails 2.0 М2. У меня есть следующие свойства, определенные в моем файле 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`
  

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

Итак, короче говоря, если я установлю значение app.context to / , я БЫ НЕ ожидал app.name , что оно появится в моем конечном URL-адресе перенаправления.

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

Ответ №1:

Мне неприятно это говорить, но я тоже не могу это воспроизвести. Я создал тестовый проект с одним контроллером (с именем 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 для сопоставления с действием индекса контроллера 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 разделите себя на части. 3) В крайнем случае, напишите фильтр, прикрепленный к afterView, который выполняет поиск по регулярному выражению и заменяет содержимое на mysite.com/foobar . Не уверен, что это приведет к перенаправлению, но если что-то произойдет, я бы предположил, что это так, поскольку фильтры могут применяться на широком уровне.

Ответ №2:

   def yourAction = {

       redirect(uri:"helloworld")

  }
  

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

Ответ №3:

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

Комментарии:

1. Правильно… Tomcat может переопределить app.context в рабочей среде, однако проблема по-прежнему остается в том redirect , что Grails использует app.name при создании URL-адресов перенаправления вместо использования app.context.