¿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";
}

Respuestas:


436

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

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


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.


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.


¿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"})

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)

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


-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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.