我需要将请求URL作为String参数提交给方法
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void testItt(@RequestParam String requestParameter,
@RequestURL String requestUrl) {
// Do something with requestUrl
}
如何正确提交请求URL?
我尝试了
request.getRequestURL().toString()
但是我觉得必须有更好的方法
答案 0 :(得分:5)
永远不要只从请求中获取URL。这太容易了!编程应该很困难,而当不困难时,就让它变得困难! :)
但是您可以按照上面显示的方式来获取URL
因此,让我们从一个表示您要检索的值的注释开始
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface RequestURL {
}
这将用作注入您已经可以访问的值的方式。
接下来,我们需要创建一个可以构建URL字符串的类
public class RequestUrlArgumentResolver
implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return methodParameter.getParameterAnnotation(RequestURL.class) != null;
}
@Override
public Object resolveArgument(
MethodParameter methodParameter,
ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request
= (HttpServletRequest) nativeWebRequest.getNativeRequest();
//Nice and cozy at home surrounded by safety not obfuscation
return request.getRequestURL().toString();
}
}
接下来我们要做的是获取一个框架来识别该注释的处理程序。
将以下方法添加到您的配置中(如果您的配置未实现WebMvcConfigurer,则可能需要实现此类或创建一个包含并包含新配置的新配置)
...
@Override
public void addArgumentResolvers(
List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new RequestUrlArgumentResolver());
}
...
然后,我们终于回到您的原始请求映射,它应该可以按照原始编写的方式工作
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void testItt(@RequestParam String requestParameter,
@RequestURL String requestUrl) {
// Do something with requestUrl
}