Принять несколько параметров в одном PathVariable - PullRequest
1 голос
/ 21 октября 2019

У меня есть метод контроллера, такой как:

@PostMapping("/view/{location}")
public ModelAndView view(@PathVariable("location") String location) {

    ModelAndView modelAndView = new ModelAndView();
    return modelAndView;
}

Этот метод способен получать запросы, такие как

"/ view / a" или "/ view / b"такой, что pathVariable location становится a или b.

Но я хочу, чтобы этот же метод получал все запросы, имеющие / view в их начале, такие, что pathVariable "location " содержит остальные данные.

, например,

для запроса как / view / a / b / c , pathVariable location станет a / b / c .

как иерархия файловой системы.

Пожалуйста, дайте мне знать, если такая вещьэто возможно в Spring MVC, и я очень новичок в этом.

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Ознакомьтесь с этой статьей

Идея состоит в том, чтобы сопоставить все пути, начинающиеся с /view, с одним методом контроллера, добавив **, но вам придетсяиспользуйте HttpServletRequest вместо @PathVariable.

Итак, в вашем случае это будет примерно так:

@PostMapping("/view/**")
public ModelAndView view(HttpServletRequest request) {
    String pathVariable = extractId(request);         

    ModelAndView modelAndView = new ModelAndView();
    return modelAndView;
}

private String extractId(HttpServletRequest request) {
    String path = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    String bestMatchPattern = (String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
    return new AntPathMatcher().extractPathWithinPattern(bestMatchPattern, path);
}

Также проверьте этот вопрос

1 голос
/ 21 октября 2019

Вы можете использовать подход, описанный ранее,

@GetMapping(value = "blog/**")
public Blog show(HttpServletRequest request){   
    String id = (String) 
            request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    System.out.println(id);
    int blogId = Integer.parseInt(id);
    return blogMockedData.getBlogById(blogId);
}

Второй способ - использовать RequestParam вместо переменной Path.

вы будете вызывать API, используя:

http://localhost:8080/blog?input=nabcd/2/nr/dje/jfir/dye

контроллер будет выглядеть так: @GetMapping(value = "blog") public Blog show(@RequestParam("input") String input){


Если вы уверены в количестве слеш в вашемвход, вы можете пойти с любым подходом, упомянутым здесь справка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...