sirve requestmapping requestbody que para mvc modelo ejemplo arquitectura java spring spring-mvc annotations

java - requestmapping - Spring Web MVC: utilice el mismo mapeo de solicitud para el parámetro de solicitud y la variable de ruta



requestmapping spring boot (3)

La anotación @RequestMapping ahora admite establecer el atributo de path lugar de name o value . Con path , puede lograr el mapeo deseado por 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) {

¿Hay alguna forma de expresar que mi método de controlador MVC de Spring Web debería coincidir con una solicitud de identificación como parte de la ruta URI ...?

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

... o si el cliente envía la ID como un parámetro de solicitud HTTP en el estilo ...

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

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

EDITAR: Resulta que actualmente parece que (con Spring MVC <= 3.0) no hay forma de lograr esto, vea la discusión dentro de la respuesta de Javi.


Puede establecer tanto la URL de asignación para la misma función como la configuración de 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 se correlacionaría también 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 está configurado como null cuando no es {null} y no puede asignar la URL (gracias ngeek). 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 reenviar: 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.


Si aún desea seguir el enfoque de PathVariable y si está obteniendo 400 errores sintácticamente incorrectos, siga este enfoque:

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