我试图解决一些RequestMapping
方法的某些参数,从请求主体中提取值并验证它们并将它们注入特定的注释参数中。在Spring的HandlerMethodArgumentResolver中,我如何多次读取请求体?
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 1, get corresponding input parameter from NativeWebRequest
// 2, validate
// 3, type convertion and assemble value to return
return null;
}
最大的问题是,我发现,HttpServletRequest
(从NativeWebRequest
获得)无法读取输入流(一些参数是在请求体)一次以上。那么我怎样才能多次检索Inputstream
/Reader
或请求主体?
一个解决方案可能是使用ThreadLocal将请求中的参数存储在过滤器中,然后在代码中的任意位置在任意时间使用它们。 –
@SandeepPoonia这可能有帮助。但是一个问题是,如果我将主体保存到threadlocal中(通过调用HttpServletRequest.getReader/getInputStream),将永远不会再调用它。在控制器层的事件中,我无法声明“@RequestBody String body”(它可能会在Spring中引发异常),因为Spring无法再读取输入流。 – Kim