Today I stumbled across a problem where a slash can occur in a path variable.
The contents of the path variable can look like this:
1/53879d5c-b07b-44f2-9a77-b99f67bb8481 or even 1/2/53879d5c-b07b-44f2-9a77-b99f67bb8481
At the backend, I need the full path in a variable because the path can contain several slashes but does not have to.
Let’s have a look at this as a code example to make it clear.
@GetMapping("/rest/{path}") public @ResponseBody ResponseEntity<Container> getContainerByPath(@PathVariable String path) { return containerService.getByPath(path); }
The path /1/53879d5c-b07b-44f2-9a77-b99f67bb8481 will not work.
The solution is HttpServletRequest.
// /rest/1/53879d5c-b07b-44f2-9a77-b99f67bb8481 @GetMapping("/rest/**") public @ResponseBody ResponseEntity<Container> getContainerByPath(HttpServletRequest request) { String path = extractPath(request); return containerService.getByPath(path); }
private String extractPath(HttpServletRequest request) { String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); String matchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); // /rest/** return new AntPathMatcher().extractPathWithinPattern(matchPattern, path); // 1/53879d5c-b07b-44f2-9a77-b99f67bb8481 }