Spring @PathVariable 获取 / 之后的所有内容
Spring @PathVariable get everything after /
我有一些 url 类型:"/something/some/random/path"
对于所有以 "/something/"
开头的 url 我希望它之后的所有内容都被视为路径变量
@RequestMapping("/something/{path}")
public MyCustomObj get(@PathVariable("path") String path){
System.out.println(path); // "some/random/path"
}
我知道重定向是可行的,但不是我需要的。
我尝试使用正则表达式,但似乎不起作用
@RequestMapping("/spring-web/{path:.*}
有什么方法可以做到这一点,或者有什么变通办法吗?
谢谢
我在这里看到 2 个解决方法:
@RequestMapping("/something/**")
并注入 HttpServletRequest:
public MyCustomObj get(HttpServletRequest)
并使用 request.getServletPath()
手动解析路径
使用自定义 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)
。记得注册你的参数解析器。
我有一些 url 类型:"/something/some/random/path"
对于所有以 "/something/"
开头的 url 我希望它之后的所有内容都被视为路径变量
@RequestMapping("/something/{path}")
public MyCustomObj get(@PathVariable("path") String path){
System.out.println(path); // "some/random/path"
}
我知道重定向是可行的,但不是我需要的。 我尝试使用正则表达式,但似乎不起作用
@RequestMapping("/spring-web/{path:.*}
有什么方法可以做到这一点,或者有什么变通办法吗?
谢谢
我在这里看到 2 个解决方法:
@RequestMapping("/something/**")
并注入 HttpServletRequest:public MyCustomObj get(HttpServletRequest)
并使用request.getServletPath()
手动解析路径
使用自定义
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)
。记得注册你的参数解析器。