2012-09-28 10 views
6

Tengo una situación donde necesito la siguiente RequestMapping:Cómo definir RequestMapping priorización

@RequestMapping(value={"/{section}"}) 
...method implementation here... 

@RequestMapping(value={"/support"}) 
...method implementation here... 

Hay un conflicto evidente. Mi esperanza era que Spring resolviera esto automáticamente y asignara /support al segundo método, y todo lo demás al primero, pero en su lugar asigna /support al primer método.

¿Cómo puedo decirle a Spring que permita un RequestMapping explícito para anular un RequestMapping con un PathVariable en el mismo lugar?

Edición 2: Parece que funcionaría si el mapeo /support se presentó ante el /{section} mapeo. Lamentablemente tenemos docenas de controladores que contienen numerosos métodos con RequestMapping. ¿Cómo puedo asegurarme de que el controlador con la asignación /{section} se haya inicializado por última vez? ¿O un preinterceptor sería el camino a seguir?

Edición 1: Esto se simplifica, ya sé que el tener los dos RequestMapping por sí sola no tendría mucho sentido)

+0

¿El orden en el archivo no hace diferencia? – Keppil

+1

@Keppil Están en dos archivos diferentes. –

Respuesta

3

el uso de primavera se puede ampliar el org.springframework.web.HttpRequestHandler para apoyar su escenario.

implementar el método:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} 

utilizarlo para analizar la solicitud entrante, determinar si la solicitud de URL es parte de su subconjunto especial de solicitud de URL de y hacia adelante a la ubicación adecuada.

Ex:

@Override 
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
/** You will want to check your array of values and have this data cached **/ 
if (urlPath.contains("/sectionName")) { 
     RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath); 
     requestDispatcher.forward(request, response); 
    } 

} 

y la configuración de sus secciones como:

@RequestMapping(value={"/sections/{sectionName}"}) 

Esto no va a interferir con ninguna de sus asignaciones de controlador pre-existentes.

+0

Impresionante solución. Una respuesta sólida, otorgará la recompensa una vez que el sitio lo permita. Muchas gracias ddubyat !! –

1

Si se definen estos métodos 2 de 2 controladores diferentes que su problema es que usted tiene 2 controladores mapeado a la misma URL. No controlas el orden de inicialización de los controladores en este momento, por lo que el orden es aleatorio.

Creo que es necesario inicializar el mapeo /support antes de /{section}.

Para lograr esto, intente definir que el controlador "sección" depende del controlador "soporte". Si esto no ayuda a tratar de poner ambos métodos en un solo controlador y poner el método asignado a "soporte" antes de "sección"

Esto no funciona aquí es otra sugerencia. ¿Qué "sección" es? Si puede aceptar un número limitado de valores, debe definirse como enum. Creo que en este caso todo funcionará como se requiere si los métodos de soporte y sección están en un controlador o en controladores separados.

Buena suerte.

+0

Gracias por la respuesta, Alex. Hay muchos métodos '/ x '' RequestMapping' dispersos en numerosos controladores. Entonces, esencialmente, tendríamos que pegar "/ {section}" al final del orden de inicialización. ¿Hay alguna manera de forzar la última carga de ese controlador o método? –

0

No veo este comportamiento con Spring 3.1.2, podría haber sido un error con una versión anterior de Spring. Aquí hay una esencia que se ejecuta sin ningún problema para mí - https://gist.github.com/3802254

+0

Gracias, Biju. En su esencia, primero tiene el método 'muestra '. ¿Puedes cambiar el orden de los dos métodos y ver si todavía obtienes los mismos resultados? El orden inverso es como el nuestro está configurado ... –

+0

Sí, lo intenté también, funciona con Spring 3.1.2 –

+0

Aprecio que lo prueben, Biju. Lamentablemente, actualizar a 3.1.2 no es una opción en este momento, pero es alentador saber que puede resolverse cuando finalmente actualicemos. –

1

Esto no parece ser un problema, esta es una asignación válida. Si usted tiene una mirada a http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-uri-templates

En la sección 16.3.2 Las solicitudes mapeo con @RequestMapping existen dos métodos de hacer exactamente lo mismo que usted está tratando.

Para asegurarse de que sus clases se compilan intente agregar @RequestMapping ("/ someprefix") a nivel de clase para ver si la URL se está exponiendo como lo desea.

Verifico tu ejemplo localmente utilizando la versión 3.1.0.RELEASE y no hubo problemas.

Como solución alternativa (y también para proporcionar un bien entienden REST URI añadir un poco de contexto a su segunda asignación:

@RequestMapping(value={"client/support"}) // i.e: if you are working with clients 
public ModelAndView getsupport(@PathVariable Long supportId){ 
    // do your code here something here 
    } 

Por supuesto que esto es válido si este es el único controlador presente en el sistema, de lo contrario debe utilizar RequestMapping a nivel de clase como he sugerido anteriormente.

espero que esto ayude.

+0

¡Esta debería ser la respuesta correcta! –

Cuestiones relacionadas