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