Мне нужно написать Spring RestController, который ловит URL-адреса, составленные из произвольного числа переменных.В частности, мне нужно отобразить что-то вроде /{id1}/{id2}/some/dynamic/path/
наряду с «нормальными» отображениями, такими как /{someid}
и / или /
./{id1}/{id2}/some/dynamic/path/
необходимо сопоставить трем параметрам id1
, id2
и some/dynamic/path
, где путь может быть любым от нуля до 10 сегментов.
Возможно, я что-то не так понял, но catchAll()
Я реализовал для этого случая всегда ловит все - и игнорирует другие пути.Как мне решить эту проблему?
Вот мой код:
@RestController
@RequestMapping("/")
public class MyController
{
@GetMapping("/")
@ResponseBody
public ResponseEntity staticPath()
{
return new ResponseEntity<String>("1", HttpStatus.OK);
}
@GetMapping("/{someid}")
@ResponseBody
public ResponseEntity pathWithOneVar(@PathVariable String someid)
{
return new ResponseEntity<String>("2", HttpStatus.OK);
}
@RequestMapping("{id1}/{id2}/**")
@ResponseBody
public ResponseEntity catchAll(@PathVariable String id1, @PathVariable String id2)
{
HttpServletRequest requestServlet = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
requestServlet.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE));
return new ResponseEntity<String>("3", HttpStatus.OK);
}
}
Что мне нужно:
- Карта
/
в staticPath () - Отображение
/42
на pathWithOneVar (): var someid
= 42 - Отображение
/1/2
на catchAll (): var id1
= 1, var id2
= 2, var path
= "" - Карта
/1/2/a
для catchAll (): var id1
= 1, var id2
= 2, var path
= "a" - Map
/1/2/a/b/c/d/e/f/g/h/i/j/k
to catchAll (): var id1
= 1, var id2
= 2, var path
= "a / b / c / d / e / f / g / h / i / j / k"