requestparam requestmapping query pathvariable how entre diferencia annotation java rest url spring-boot path-variables

java - requestmapping - @PathVariable en SpringBoot con barras en URL



spring @param (3)

Este código obtiene la ruta completa:

@RequestMapping(value = "/modules/{moduleBaseName}/**", method = RequestMethod.GET) @ResponseBody public String moduleStrings(@PathVariable String moduleBaseName, HttpServletRequest request) { final String path = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE).toString(); final String bestMatchingPattern = request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE).toString(); String arguments = new AntPathMatcher().extractPathWithinPattern(bestMatchingPattern, path); String moduleName; if (null != arguments && !arguments.isEmpty()) { moduleName = moduleBaseName + ''/'' + arguments; } else { moduleName = moduleBaseName; } return "module name is: " + moduleName; }

Tengo que obtener los parámetros de la URL usando @PathValiable en la aplicación SpringBoot. Estos params a menudo tienen barras . No tengo control sobre lo que un usuario ingresaría en la URL, así que me gustaría obtener lo que ha ingresado y luego puedo manejarlo.

Ya he revisado aquí los materiales y las respuestas, no creo que para mí la buena solución sea pedirles a los usuarios que codifiquen de alguna manera los parámetros de entrada.

El código de SpringBoot es simple:

@RequestMapping("/modules/{moduleName}") @ResponseBody public String moduleStrings (@PathVariable("moduleName") String moduleName) throws Exception { ... }

Entonces, la URL, por ejemplo, sería la siguiente:

http://localhost:3000/modules/...

El problema es que param moduleName a menudo tiene barras inclinadas. Por ejemplo,

metadata-api/cb-metadata-services OR app-customization-service-impl//modules//expand-link-schemes//common//app-customization-service-api

Entonces un usuario definitivamente puede ingresar:

http://localhost:3000/modules/metadata-api/cb-metadata-services

¿Es posible obtener todo lo que un usuario ha ingresado en la URL después de / modules / ?

Si alguien me dice cuáles son las buenas maneras de manejar ese problema.


@RequestMapping("/modules/**")


Basándome en la respuesta de PJMeisch, he llegado a la solución simple para mi caso. También permite tener en cuenta varias barras en el parámetro URL. No permite trabajar con barras diagonales inversas como en la respuesta anterior también.

@RequestMapping(value = "/modules/**", method = RequestMethod.GET) @ResponseBody public String moduleStrings(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); String moduleName = requestURL.split("/modules/")[1]; return "module name is: " + moduleName; }