您的位置:首页 > 编程语言 > Java开发

SpringMVC中HandlerMethod的请求参数解析过程

2018-07-25 17:32 411 查看
 
  1. private Object[] resolveHandlerArguments(Method handlerMethod, Object handler,

  2. NativeWebRequest webRequest, ExtendedModelMap implicitModel) throws Exception {

  3.  
  4. Class[] paramTypes = handlerMethod.getParameterTypes();

  5. Object[] args = new Object[paramTypes.length];

  6.  
  7. for (int i = 0; i < args.length; i++) {

  8. MethodParameter methodParam = new MethodParameter(handlerMethod, i);

  9. methodParam.initParameterNameDiscovery(this.parameterNameDiscoverer);

  10. GenericTypeResolver.resolveParameterType(methodParam, handler.getClass());

  11. String paramName = null;

  12. String headerName = null;

  13. boolean requestBodyFound = false;

  14. String cookieName = null;

  15. String pathVarName = null;

  16. String attrName = null;

  17. boolean required = false;

  18. String defaultValue = null;

  19. boolean validate = false;

  20. Object[] validationHints = null;

  21. int annotationsFound = 0;

  22. Annotation[] paramAnns = methodParam.getParameterAnnotations();

  23.  
  24. for (Annotation paramAnn : paramAnns) {

  25. if (RequestParam.class.isInstance(paramAnn)) {

  26. RequestParam requestParam = (RequestParam) paramAnn;

  27. paramName = requestParam.value();

  28. required = requestParam.required();

  29. defaultValue = parseDefaultValueAttribute(requestParam.defaultValue());

  30. annotationsFound++;

  31. }

  32. else if (RequestHeader.class.isInstance(paramAnn)) {

  33. RequestHeader requestHeader = (RequestHeader) paramAnn;

  34. headerName = requestHeader.value();

  35. required = requestHeader.required();

  36. defaultValue = parseDefaultValueAttribute(requestHeader.defaultValue());

  37. annotationsFound++;

  38. }

  39. else if (RequestBody.class.isInstance(paramAnn)) {

  40. requestBodyFound = true;

  41. annotationsFound++;

  42. }

  43. else if (CookieValue.class.isInstance(paramAnn)) {

  44. CookieValue cookieValue = (CookieValue) paramAnn;

  45. cookieName = cookieValue.value();

  46. required = cookieValue.required();

  47. defaultValue = parseDefaultValueAttribute(cookieValue.defaultValue());

  48. annotationsFound++;

  49. }

  50. else if (PathVariable.class.isInstance(paramAnn)) {

  51. PathVariable pathVar = (PathVariable) paramAnn;

  52. pathVarName = pathVar.value();

  53. annotationsFound++;

  54. }

  55. else if (ModelAttribute.class.isInstance(paramAnn)) {

  56. ModelAttribute attr = (ModelAttribute) paramAnn;

  57. attrName = attr.value();

  58. annotationsFound++;

  59. }

  60. else if (Value.class.isInstance(paramAnn)) {

  61. defaultValue = ((Value) paramAnn).value();

  62. }

  63. else if (paramAnn.annotationType().getSimpleName().startsWith("Valid")) {

  64. validate = true;

  65. Object value = AnnotationUtils.getValue(paramAnn);

  66. validationHints = (value instanceof Object[] ? (Object[]) value : new Object[] {value});

  67. }

  68. }

  69.  
  70. if (annotationsFound > 1) {

  71. throw new IllegalStateException("Handler parameter annotations are exclusive choices - " +

  72. "do not specify more than one such annotation on the same parameter: " + handlerMethod);

  73. }

  74.  
  75. if (annotationsFound == 0) {

  76. Object argValue = resolveCommonArgument(methodParam, webRequest);

  77. if (argValue != WebArgumentResolver.UNRESOLVED) {

  78. args[i] = argValue;

  79. }

  80. else if (defaultValue != null) {

  81. args[i] = resolveDefaultValue(defaultValue);

  82. }

  83. else {

  84. Class<?> paramType = methodParam.getParameterType();

  85. if (Model.class.isAssignableFrom(paramType) || Map.class.isAssignableFrom(paramType)) {

  86. if (!paramType.isAssignableFrom(implicitModel.getClass())) {

  87. throw new IllegalStateException("Argument [" + paramType.getSimpleName() + "] is of type " +

  88. "Model or Map but is not assignable from the actual model. You may need to switch " +

  89. "newer MVC infrastructure classes to use this argument.");

  90. }

  91. args[i] = implicitModel;

  92. }

  93. else if (SessionStatus.class.isAssignableFrom(paramType)) {

  94. args[i] = this.sessionStatus;

  95. }

  96. else if (HttpEntity.class.isAssignableFrom(paramType)) {

  97. args[i] = resolveHttpEntityRequest(methodParam, webRequest);
  98. }

  99. else if (Errors.class.isAssignableFrom(paramType)) {

  100. throw new IllegalStateException("Errors/BindingResult argument declared " +

  101. "without preceding model attribute. Check your handler method signature!");

  102. }

  103. else if (BeanUtils.isSimpleProperty(paramType)) {

  104. paramName = "";

  105. }

  106. else {

  107. attrName = "";

  108. }

  109. }

  110. }

  111.  
  112. if (paramName != null) {

  113. args[i] = resolveRequestParam(paramName, required, defaultValue, methodParam, webRequest, handler);

  114. }

  115. else if (headerName != null) {

  116. args[i] = resolveRequestHeader(headerName, required, defaultValue, methodParam, webRequest, handler);

  117. }

  118. else if (requestBodyFound) {

  119. args[i] = resolveRequestBody(methodParam, webRequest, handler);

  120. }

  121. else if (cookieName != null) {

  122. args[i] = resolveCookieValue(cookieName, required, defaultValue, methodParam, webRequest, handler);

  123. }

  124. else if (pathVarName != null) {

  125. args[i] = resolvePathVariable(pathVarName, methodParam, webRequest, handler);

  126. }

  127. else if (attrName != null) {

  128. WebDataBinder binder =

  129. resolveModelAttribute(attrName, methodParam, implicitModel, webRequest, handler);

  130. boolean assignBindingResult = (args.length > i + 1 && Errors.class.isAssignableFrom(paramTypes[i + 1]));

  131. if (binder.getTarget() != null) {

  132. doBind(binder, webRequest, validate, validationHints, !assignBindingResult);

  133. }

  134. args[i] = binder.getTarget();

  135. if (assignBindingResult) {

  136. args[i + 1] = binder.getBindingResult();

  137. i++;

  138. }

  139. implicitModel.putAll(binder.getBindingResult().getModel());

  140. }

  141. }

  142.  
  143. return args;

  144. }

  这个方法的调用关系如下图所示,

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: