2011-11-02 11 views
5

Estoy notando un comportamiento extraño con redirect cuando configuro mi app.context de cierta manera. He encontrado un fallo en el Griales JIRA que describe perfectamente mi problema, pero fue marcado como UTR: http://jira.grails.org/browse/GRAILS-7546Grails redirige a una dirección incorrecta al usar app.context?


Aquí es mi descripción del problema:
Actualmente estoy usando Grails 2.0M2. Tengo las siguientes propiedades definidas en mis application.properties presentar:

app.context=/ 
app.name=foobar 

cuando llamo redirect en un controlador, redirect es la adición del nombre de la aplicación a la URI que proporciono, que a su vez provoca un 404. Aquí es cómo estoy haciendo esto:

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` 

Supongamos que tengo una correlación de URL llamado helloworld define en mi archivo UrlMappings.groovy con un camino de /hello/world.

Así, el cuento largo, si fijo el app.context a /, me NO esperar que el app.name a aparecer en mi URL de redireccionamiento final.

¿Esto es un error o comportamiento esperado? ¿Alguna idea sobre la forma más fácil de construir la URL de redireccionamiento sin hacer demasiados pasos manuales?

Respuesta

0

No es una respuesta directa a su pregunta, pero mi práctica es: nunca modifico app.context en las propiedades de grial ya que tomcat lo reemplaza en producción y no me importa qué contexto usa en mi desarrollo.

+1

Derecha ... Tomcat puede anular app.context en producción, sin embargo, el problema sigue siendo que 'redirigir' que Grails está utilizando la aplicación.nombre al compilar URL de redireccionamiento en lugar de usar app.context. – Polaris878

1

Odio decirlo, pero tampoco puedo reproducirlo. He creado un proyecto de prueba con un controlador (llamado Hola), utilizando el código para crear una acción que no hace más que redirigir:

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` 
    } 
} 

creé una página de índice, en index.gsp los puntos de vista/hola

index.gsp

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

de instalación en el urlMappings para asignar a la acción index del controlador hello:

UrlMappings.groovy

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

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

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

y cambió el application.properties tener los 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 

Cuando me encontré con la aplicación, por lo que pude ve a localhost: 8080/hello y mostraría mi simple GSP. Probé localhost: 8080/helloworld y también lo obtuve como esperaba por el mapeo. Luego probé localhost: 8080/hello/redir y fui redireccionado apropiadamente a localhost: 8080/helloworld.

Sin embargo, si todavía tiene este problema, tengo algunas sugerencias 1) Pruebe usar el nuevo generador de enlaces disponible en 2.0 en lugar de createLink. Puede que no haga nada diferente, pero vale la pena intentarlo: grailsLinkGenerator.link(mapping: 'helloworld') 2) Si solo se trata de redirecciones desde dentro de los controladores, puede agregar la porción http://mysite.com usted mismo a partialUrl. 3) Último recurso, escriba un filtro adjunto a afterView que realice una búsqueda de expresiones regulares y reemplace los contenidos de mysite.com/foobar. Sin embargo, no estoy seguro si esto atrapará los redireccionamientos, pero si algo sucediera, asumiría que esto sería así ya que los filtros pueden aplicarse a un nivel amplio.

1
def yourAction = { 

     redirect(uri:"helloworld") 

    } 

Eso no funciona para usted?

Cuestiones relacionadas