ApiInfoHolder.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package cn.com.qmth.mps.support;
  2. import java.lang.reflect.Method;
  3. import java.util.Map;
  4. import java.util.Set;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.boot.ApplicationArguments;
  8. import org.springframework.boot.ApplicationRunner;
  9. import org.springframework.core.annotation.AnnotationUtils;
  10. import org.springframework.core.annotation.Order;
  11. import org.springframework.stereotype.Component;
  12. import org.springframework.web.bind.annotation.RequestMapping;
  13. import org.springframework.web.bind.annotation.RequestMethod;
  14. import org.springframework.web.method.HandlerMethod;
  15. import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
  16. import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
  17. import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
  18. import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
  19. import com.google.common.collect.Maps;
  20. import com.google.common.collect.Sets;
  21. import io.swagger.annotations.ApiOperation;
  22. @Component
  23. @Order(100)
  24. public class ApiInfoHolder implements ApplicationRunner {
  25. private static final Map<String, ApiInfo> INDEX_BY_MAPPING = Maps.newConcurrentMap();
  26. private static final Map<Method, ApiInfo> INDEX_BY_METHOD = Maps.newConcurrentMap();
  27. private static Set<ApiInfo> apiInfoSet = Sets.newHashSet();
  28. @Autowired
  29. private RequestMappingHandlerMapping requestMappingHandlerMapping;
  30. /**
  31. * 通过方法获取ApiInfo
  32. *
  33. * @author
  34. * @param method
  35. * @return
  36. */
  37. public static ApiInfo getApiInfo(Method method) {
  38. return INDEX_BY_METHOD.get(method);
  39. }
  40. /**
  41. * 通过mapping获取ApiInfo
  42. *
  43. * @author
  44. * @param mapping
  45. * @return
  46. */
  47. public static ApiInfo getApiInfo(String mapping) {
  48. return INDEX_BY_MAPPING.get(mapping);
  49. }
  50. /**
  51. * 获取@ApiId注解的ApiInfo集合
  52. *
  53. * @author
  54. * @return
  55. */
  56. public static Set<ApiInfo> getApiInfoSet() {
  57. return apiInfoSet;
  58. }
  59. @Override
  60. public void run(ApplicationArguments args) throws Exception {
  61. Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
  62. .getHandlerMethods();
  63. for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
  64. RequestMappingInfo requestMappingInfo = entry.getKey();
  65. HandlerMethod handlerMethod = entry.getValue();
  66. Class<?> beanType = handlerMethod.getBeanType();
  67. RequestMapping requestMappingAnnotationOfClass = AnnotationUtils
  68. .findAnnotation(beanType, RequestMapping.class);
  69. RequestMapping requestMappingAnnotationOfMethod = handlerMethod
  70. .getMethodAnnotation(RequestMapping.class);
  71. WithoutStackTrace withoutStackTrace = handlerMethod
  72. .getMethodAnnotation(WithoutStackTrace.class);
  73. ApiOperation apiOperation = handlerMethod.getMethodAnnotation(ApiOperation.class);
  74. RequestMethodsRequestCondition requestMethodsRequestCondition = requestMappingInfo
  75. .getMethodsCondition();
  76. Set<RequestMethod> requestMethodSet = requestMethodsRequestCondition.getMethods();
  77. String[] mappingURIsOfClass = null;
  78. String[] mappingURIsOfMethod = null;
  79. if (null != requestMappingAnnotationOfClass) {
  80. mappingURIsOfClass = requestMappingAnnotationOfClass.path();
  81. }
  82. if (null != requestMappingAnnotationOfMethod) {
  83. mappingURIsOfMethod = requestMappingAnnotationOfMethod.path();
  84. }
  85. String mappingIdentifyOfClass = null;
  86. String mappingIdentifyOfMethod = null;
  87. if (null != mappingURIsOfClass) {
  88. mappingIdentifyOfClass = StringUtils.join(mappingURIsOfClass, ",");
  89. }
  90. if (null != mappingURIsOfMethod) {
  91. mappingIdentifyOfMethod = StringUtils.join(mappingURIsOfMethod, ",");
  92. }
  93. String methods = StringUtils.join(requestMethodSet, ",");
  94. String mapping = StringUtils.join("[", mappingIdentifyOfClass, "][",
  95. mappingIdentifyOfMethod, "][", methods, "]");
  96. PatternsRequestCondition patternsRequestCondition = requestMappingInfo
  97. .getPatternsCondition();
  98. String requestPath = StringUtils.join(patternsRequestCondition.getPatterns(), ",");
  99. ApiInfo apiInfo = new ApiInfo();
  100. if (null != apiOperation) {
  101. apiInfo.setDescription(apiOperation.value());
  102. }
  103. apiInfo.setHttpMethod(methods);
  104. apiInfo.setMapping(mapping);
  105. apiInfo.setRequestPath(requestPath);
  106. apiInfo.setBeanType(beanType);
  107. if (null != withoutStackTrace) {
  108. apiInfo.setWithoutStackTrace(withoutStackTrace.value());
  109. }
  110. INDEX_BY_METHOD.put(handlerMethod.getMethod(), apiInfo);
  111. INDEX_BY_MAPPING.put(mapping, apiInfo);
  112. }
  113. }
  114. }