2016-05-24 3 views
0

У меня есть URL типа: "/something/some/random/path"Spring @PathVariable получить все после того, как/

для всех страниц, которые начинаются с "/something/" Я хочу, чтобы все, после того, как она будет рассматриваться как путь переменной

@RequestMapping("/something/{path}") 
public MyCustomObj get(@PathVariable("path") String path){ 
    System.out.println(path); // "some/random/path" 
} 

Я знаю, возможно с перенаправлением, но это не то, что мне нужно. Я попытался с регулярным выражением, но не похоже на работу

@RequestMapping("/spring-web/{path:.*}

Там есть ли способ сделать это, или, возможно, некоторые работы arrounds?

Благодаря

ответ

2

Я вижу 2 обходные здесь:

  1. @RequestMapping("/something/**") и впрыснуть HTTPServletRequest: public MyCustomObj get(HttpServletRequest) и вручную разобрать путь, используя request.getServletPath()
  2. Сделайте то же самое, что и выше с помощью пользовательских HandlerMethodArgumentResolver. Вы можете создать пользовательскую аннотацию для этого, например. @MyPath:

    public class MyPathResolver implements HandlerMethodArgumentResolver { 
    
        @Override 
        public boolean supportsParameter(MethodParameter parameter) { 
         return parameter.hasParameterAnnotation(MyPath.class); 
        } 
    
        @Override 
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, 
        NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { 
         return ((ServletWebRequest) webRequest).getRequest().getServletPath().split("/")[2]; 
         //you can do whatever you want here, you can even get a value from your RequestMapping annotation 
         and customize @MyPath value as you want 
        } 
    } 
    

Затем вы можете придать вновь созданный аннотацию вроде этого: public MyCustomObj get(@MyPath String path). Не забудьте зарегистрировать свой аргумент.

Смежные вопросы