2010-04-30 16 views
37

¿Hay alguna manera de expresar que mi método de controlador Spring Web MVC debe coincidir con una solicitud de identificación como parte de la ruta URI ...Spring Web MVC: Use la misma solicitud de asignación para el parámetro de solicitud y la variable de ruta

@RequestMapping(method=RequestMethod.GET, value="campaigns/{id}") 
public String getCampaignDetails(Model model, @PathVariable("id") Long id) { 

... o si el cliente envía el ID como parámetro de petición HTTP en el estilo ...

@RequestMapping(method=RequestMethod.GET, value="campaigns") 
public String getCampaignDetails(Model model, @RequestParam("id") Long id) { 

Esto me parece un esquema bastante común URL en el mundo real donde no quiero agregar código duplicado, pero aún no he podido encontrar una respuesta. Cualquier consejo muy bienvenido.

EDIT: Resulta que parece que hay actualmente (con Spring MVC < = 3,0) hay manera de lograr esto, véase el debate dentro de la respuesta de Javi.

Respuesta

50

Puede establecer la url de asignación para la misma función y establecer el ID como opcional.

@RequestMapping(method=RequestMethod.GET, value={"/campaigns","/campaigns/{id}"}) 
public String getCampaignDetails(Model model, 
    @RequestParam(value="id", required=false) Long id, 
    @PathVariable("id") Long id2) 
{ 
} 

aunque también se asignaría cuando no se envíe la identificación, pero puede controlar esto dentro del método.

EDITAR: La solución anterior no funciona porque @PathVariable no se ajusta a null cuando no hay {null} y no se puede asignar la dirección URL (ngeek gracias). Creo que la única solución posible es crear dos métodos, cada uno mapeado con su @MappingRequest y dentro de uno de ellos llamar a la otra función o redirigir a la otra URL (redirigir: o hacia adelante: prefijos de primavera). Sé que esta solución no es lo que estás buscando, pero creo que es lo mejor que puedes hacer. De hecho, no está duplicando el código, pero está creando otra función para manejar otra URL.

+1

Lamentablemente, esto no funciona, ya que la variable de ruta no se puede resolver. También probé una variante añadiendo a los parámetros del método (@PathVariable ("id") Long id2) pero luego no puede hacer que una variable de ruta sea opcional, por lo tanto, esta solución propuesta no funciona. ¿Alguna otra recomendación? – ngeek

+0

@ngeek No me di cuenta de que @PathVariable no se pudo establecer como nulo, gracias. También me olvidé de escribir @PathVariable, así que edité mi respuesta para agregarla y creo que no puedes evitar tener 2 métodos, creo :(. – Javi

+1

Gracias por volver a tu propuesta Javi. Claro que ya estaba delegando en el mismo método interno para evitar duplicar el código. Sigo pensando que las anotaciones de Spring MVC deberían proporcionar un medio para mapear múltiples definiciones de URL al mismo método por media intrínseca, como los enrutadores en Rails o Grails ya lo permiten. Gracias por su ayuda de todos modos. – ngeek

4

Si todavía quiere meter a PathVariable enfoque y si está recibiendo el error 400 sintácticamente incorrecta, siga este approach-

@RequestMapping(method=RequestMethod.GET, value={"campaigns/{id}","campaigns"}) 
         public String getCampaignDetails(Model model, 
         @PathVariable Map<String, String> pathVariables) 
    { 

    System.out.println(pathVariables.get("id")); 

    } 
1

La anotación @RequestMapping ahora es compatible con el establecimiento de la path atribuyen en lugar de name o value. Con path, puede lograr la asignación deseada con esta pregunta:

@RequestMapping(method=RequestMethod.GET, path="campaigns/{id}") 
public String getCampaignDetails(Model model, @PathVariable("id") Long id) { 

@RequestMapping(method=RequestMethod.GET, value="campaigns") 
public String getCampaignDetails(Model model, @RequestParam("id") Long id) { 
Cuestiones relacionadas