¿Cómo usar múltiples anotaciones @RequestMapping en primavera?

247

¿Es posible usar múltiples @RequestMappinganotaciones sobre un método?

Me gusta :

@RequestMapping("/")
@RequestMapping("")
@RequestMapping("/welcome")
public String welcomeHandler(){
  return "welcome";
}
wuntee
fuente

Respuestas:

436

@RequestMappingtiene un String[]parámetro de valor, por lo que debería poder especificar varios valores como este:

@RequestMapping(value={"", "/", "welcome"})

Ed Brannin
fuente
2
Dicho esto, estoy teniendo problemas para que los valores "" o "/" realmente funcionen en mi aplicación. ellos trabajan para ti?
Ed Brannin
¿Hay alguna forma de asociar diferentes vistas de éxito y vistas de formulario con cada URL de solicitud utilizando múltiples anotaciones?
k-den
@EdBrannin Necesito muchos para usar, personalizado, encabezado, consumo, parámetros, etc.
deFreitas
También me gustaría saber cómo sé a qué mapeo de solicitud se ha llamado. es / o bienvenido?
Siddharth
1
@Siddharth 1. Es posible que pueda agregar e inspeccionar un parámetro de tipo HttpRequest. 2. Si realmente te importa qué mapeo se llamó, quizás no uses esta técnica. ;)
Ed Brannin
24

De mi prueba (primavera 3.0.5), @RequestMapping(value={"", "/"}) solo "/"funciona, ""no funciona. Sin embargo descubrí esta obra: @RequestMapping(value={"/", " * "})el " * "concuerda con algo, por lo que será el controlador predeterminado en caso de que no hay otros.

Alan Zhong
fuente
13

No necesita hacerlo La anotación RequestMapping admite comodines y rutas de estilo hormiga. También parece que solo quieres una vista predeterminada, por lo que puedes poner

<mvc:view-controller path="/" view-name="welcome"/>

en tu archivo de configuración. Eso reenviará todas las solicitudes a la raíz a la vista de bienvenida.

Estanque Robby
fuente
¿Se supone que hay algo entre esas dos líneas? Estoy usando FreeMarkerViewResolver, por lo que tendría que ir por este camino ... Bueno, creo que podría crear múltiples ViewResolver.
wuntee
2
No proporciona la flexibilidad que proporcionarían las múltiples anotaciones de RequestMapping. Por ejemplo, si quiero tener un método compatible con el valor "/ a" con POST o el valor "/ b" con GET. Por supuesto, la solución es bastante fácil (refactorizando la funcionalidad en un tercer método), pero solo diciendo que sería útil.
Simon
1

El camino más corto es: @RequestMapping({"", "/", "welcome"})

Aunque también puedes hacer:

  • @RequestMapping(value={"", "/", "welcome"})
  • @RequestMapping(path={"", "/", "welcome"})
Marco
fuente
1

En este momento con el uso de Spring-Boot 2.0.4 - {} no funcionará.

@RequestMapping

todavía tiene String [] como parámetro de valor, por lo que la declaración se ve así:

 @RequestMapping(value=["/","/index","/login","/home"], method = RequestMethod.GET)

** Actualización: funciona con Spring-Boot 2.2 **

 @RequestMapping(value={"/","/index","/login","/home"}, method = RequestMethod.GET)
Halcón
fuente
Los corchetes no son válidos. La sintaxis válida para una matriz literal es usar llaves {}
luis.espinal
@ luis.espinal Los corchetes funcionan con la versión 2.0.4 Spring-Boot. Actualizaré mi publicación.
Falcon
0

Lo siguiente también es aceptable:

@GetMapping(path = { "/{pathVariable1}/{pathVariable1}/somePath", 
                     "/fixedPath/{some-name}/{some-id}/fixed" }, 
            produces = "application/json")

Lo mismo puede aplicarse @RequestMappingtambién

Pritam Banerjee
fuente
-2

Es mejor usar la anotación PathVariable si aún desea obtener la uri que se llamó.

@PostMapping("/pub/{action:a|b|c}")
public JSONObject handlexxx(@PathVariable String action, @RequestBody String reqStr){
...
}

o analizarlo desde el objeto de solicitud.

CQLI
fuente