SpringMVC中HandlerMethod的请求参数解析过程
2018-07-25 17:32
411 查看
-
private Object[] resolveHandlerArguments(Method handlerMethod, Object handler,
-
NativeWebRequest webRequest, ExtendedModelMap implicitModel) throws Exception {
-
Class[] paramTypes = handlerMethod.getParameterTypes();
-
Object[] args = new Object[paramTypes.length];
-
for (int i = 0; i < args.length; i++) {
-
MethodParameter methodParam = new MethodParameter(handlerMethod, i);
-
methodParam.initParameterNameDiscovery(this.parameterNameDiscoverer);
-
GenericTypeResolver.resolveParameterType(methodParam, handler.getClass());
-
String paramName = null;
-
String headerName = null;
-
boolean requestBodyFound = false;
-
String cookieName = null;
-
String pathVarName = null;
-
String attrName = null;
-
boolean required = false;
-
String defaultValue = null;
-
boolean validate = false;
-
Object[] validationHints = null;
-
int annotationsFound = 0;
-
Annotation[] paramAnns = methodParam.getParameterAnnotations();
-
for (Annotation paramAnn : paramAnns) {
-
if (RequestParam.class.isInstance(paramAnn)) {
-
RequestParam requestParam = (RequestParam) paramAnn;
-
paramName = requestParam.value();
-
required = requestParam.required();
-
defaultValue = parseDefaultValueAttribute(requestParam.defaultValue());
-
annotationsFound++;
-
}
-
else if (RequestHeader.class.isInstance(paramAnn)) {
-
RequestHeader requestHeader = (RequestHeader) paramAnn;
-
headerName = requestHeader.value();
-
required = requestHeader.required();
-
defaultValue = parseDefaultValueAttribute(requestHeader.defaultValue());
-
annotationsFound++;
-
}
-
else if (RequestBody.class.isInstance(paramAnn)) {
-
requestBodyFound = true;
-
annotationsFound++;
-
}
-
else if (CookieValue.class.isInstance(paramAnn)) {
-
CookieValue cookieValue = (CookieValue) paramAnn;
-
cookieName = cookieValue.value();
-
required = cookieValue.required();
-
defaultValue = parseDefaultValueAttribute(cookieValue.defaultValue());
-
annotationsFound++;
-
}
-
else if (PathVariable.class.isInstance(paramAnn)) {
-
PathVariable pathVar = (PathVariable) paramAnn;
-
pathVarName = pathVar.value();
-
annotationsFound++;
-
}
-
else if (ModelAttribute.class.isInstance(paramAnn)) {
-
ModelAttribute attr = (ModelAttribute) paramAnn;
-
attrName = attr.value();
-
annotationsFound++;
-
}
-
else if (Value.class.isInstance(paramAnn)) {
-
defaultValue = ((Value) paramAnn).value();
-
}
-
else if (paramAnn.annotationType().getSimpleName().startsWith("Valid")) {
-
validate = true;
-
Object value = AnnotationUtils.getValue(paramAnn);
-
validationHints = (value instanceof Object[] ? (Object[]) value : new Object[] {value});
-
}
-
}
-
if (annotationsFound > 1) {
-
throw new IllegalStateException("Handler parameter annotations are exclusive choices - " +
-
"do not specify more than one such annotation on the same parameter: " + handlerMethod);
-
}
-
if (annotationsFound == 0) {
-
Object argValue = resolveCommonArgument(methodParam, webRequest);
-
if (argValue != WebArgumentResolver.UNRESOLVED) {
-
args[i] = argValue;
-
}
-
else if (defaultValue != null) {
-
args[i] = resolveDefaultValue(defaultValue);
-
}
-
else {
-
Class<?> paramType = methodParam.getParameterType();
-
if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) {
-
if (!paramType.isAssignableFrom(implicitModel.getClass())) {
-
throw new IllegalStateException("Argument [" + paramType.getSimpleName() + "] is of type " +
-
"Model or Map but is not assignable from the actual model. You may need to switch " +
-
"newer MVC infrastructure classes to use this argument.");
-
}
-
args[i] = implicitModel;
-
}
-
else if (SessionStatus.class.isAssignableFrom(paramType)) {
-
args[i] = this.sessionStatus;
-
}
-
else if (HttpEntity.class.isAssignableFrom(paramType)) {
-
args[i] = resolveHttpEntityRequest(methodParam, webRequest);
-
}
-
else if (Errors.class.isAssignableFrom(paramType)) {
-
throw new IllegalStateException("Errors/BindingResult argument declared " +
-
"without preceding model attribute. Check your handler method signature!");
-
}
-
else if (BeanUtils.isSimpleProperty(paramType)) {
-
paramName = "";
-
}
-
else {
-
attrName = "";
-
}
-
}
-
}
-
if (paramName != null) {
-
args[i] = resolveRequestParam(paramName, required, defaultValue, methodParam, webRequest, handler);
-
}
-
else if (headerName != null) {
-
args[i] = resolveRequestHeader(headerName, required, defaultValue, methodParam, webRequest, handler);
-
}
-
else if (requestBodyFound) {
-
args[i] = resolveRequestBody(methodParam, webRequest, handler);
-
}
-
else if (cookieName != null) {
-
args[i] = resolveCookieValue(cookieName, required, defaultValue, methodParam, webRequest, handler);
-
}
-
else if (pathVarName != null) {
-
args[i] = resolvePathVariable(pathVarName, methodParam, webRequest, handler);
-
}
-
else if (attrName != null) {
-
WebDataBinder binder =
-
resolveModelAttribute(attrName, methodParam, implicitModel, webRequest, handler);
-
boolean assignBindingResult = (args.length > i + 1 && Errors.class.isAssignableFrom(paramTypes[i + 1]));
-
if (binder.getTarget() != null) {
-
doBind(binder, webRequest, validate, validationHints, !assignBindingResult);
-
}
-
args[i] = binder.getTarget();
-
if (assignBindingResult) {
-
args[i + 1] = binder.getBindingResult();
-
i++;
-
}
-
implicitModel.putAll(binder.getBindingResult().getModel());
-
}
-
}
-
return args;
-
}
这个方法的调用关系如下图所示,
阅读更多相关文章推荐
- SpringMVC中HandlerMethod的请求参数解析过程
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(一)
- SpringMVC解析请求响应请求过程-源码分析
- 假装看源码之springmvc (一) 如何进行请求参数的解析
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(二)
- Struts 2.3.24源码解析+Struts2拦截参数,处理请求,返回到前台过程详析
- springmvc put请求无法解析请求体参数解决办法
- 【spring源码学习】springMVC之映射,拦截器解析,请求数据注入解析,DispatcherServlet执行过程
- springmvc为请求处理器的目标参数赋值的过程
- Tomcat如何解析URL的请求参数(追踪HttpServletRequest对于请求参数的解析过程)
- SpringMVC——接收请求参数和页面传参
- springmvc 请求参数获取的几种方法
- SpringMVC 视图渲染过程解析
- list请求参数作为springmvc方法参数
- java解析出url请求的路径和参数
- Netty实现java多线程Post请求解析(Map参数类型)—SKY
- SpringMVC之接收请求参数和页面传参
- springmvc中同步/异步请求参数的传递以及数据的返回
- spring实战笔记6---springMVC的请求过程
- SpringMVC解析JSON请求数据