欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

获取SpringBoot中所有的url和其参数

程序员文章站 2022-04-29 19:53:41
...

获取所有url和方法的对应关系

 1 @Data
 2 public class Param {
 3 
 4     /**
 5      * 字段名称
 6      */
 7     private String name;
 8 
 9     /**
10      *
11      */
12     private String in;
13 
14     /**
15      * 字段说明
16      */
17     private String description;
18 
19     /**
20      * 字段是否必填
21      */
22     private String required;
23 
24     /**
25      * 字段类型
26      */
27     private String type;
28 
29 }
Param
 1 @Data
 2 public class VelocityTemplate {
 3 
 4     /**
 5      * api 标题
 6      */
 7     private String title;
 8 
 9     /**
10      * url 名称
11      */
12     private String urlName;
13 
14     /**
15      * 请求方法
16      */
17     private String requestMethod;
18 
19     /**
20      * 方法描述
21      */
22     private String description;
23 
24     /**
25      * 参数列表
26      */
27     private List<Param> params;
28 
29     /**
30      * 参数数量
31      */
32     private int paramsNum;
33 
34     /**
35      * 请求体格式
36      */
37     private String request;
38 
39     /**
40      * 返回体格式
41      */
42     private String response;
43 
44 
45 }
VelocityTemplate

@Autowired
private RequestMappingHandlerMapping mappingHandlerMapping;

 
 1 public List<?> getAllUrl() throws IOException {
 2         List<VelocityTemplate> urlList = new ArrayList<>();
 3         Map<RequestMappingInfo, HandlerMethod> map = mappingHandlerMapping.getHandlerMethods();
 4         for (Map.Entry<RequestMappingInfo, HandlerMethod> methodEntry : map.entrySet()) {
 5             VelocityTemplate velocityTemplate = new VelocityTemplate();
 6             RequestMappingInfo info = methodEntry.getKey();
 7             HandlerMethod method = methodEntry.getValue();
 8             PatternsRequestCondition patternsRequestCondition = info.getPatternsCondition();
 9             for (String url : patternsRequestCondition.getPatterns()) {
10                 velocityTemplate.setUrlName(url);
11             }
12 
13             RequestMethodsRequestCondition methodsRequestCondition = info.getMethodsCondition();
14             String type = methodsRequestCondition.toString();
15             if (type.startsWith("[") && type.endsWith("]")) {
16                 type = type.substring(1, type.length() - 1);
17                 // 方法名
18                 velocityTemplate.setRequestMethod(type);
19             }
20             if (StringUtils.hasText(type)) {
21                 velocityTemplate.setTitle("###" + (urlList.size() + 1) + "、" + (method.hasMethodAnnotation(ApiOperation.class) ?
22                         method.getMethodAnnotation(ApiOperation.class).value() : ""));
23                 velocityTemplate.setDescription(method.toString());
24                 MethodParameter[] methodParameters = method.getMethodParameters();
25                 List<Param> params = new ArrayList<>();
26                 for (MethodParameter methodParameter : methodParameters) {
27                     if (ObjectUtils.isEmpty(methodParameter.getParameterAnnotations()) || methodParameter.hasParameterAnnotation(Valid.class)) {
28                         ReflectionUtils.FieldCallback fieldCallback = field -> {
29                             ApiModelProperty annotation = field.getAnnotation(ApiModelProperty.class);
30                             Param param = new Param();
31                             if (annotation != null) {
32                                 param.setName(annotation.name());
33                                 param.setDescription(annotation.value());
34                             } else {
35                                 param.setName(field.getName());
36                                 param.setDescription("");
37                             }
38                             param.setType(field.getType().getTypeName());
39                             param.setRequired("是");
40                             params.add(param);
41                         };
42                         if (methodParameter.getParameterType().getName().equals(HttpServletRequest.class.getName()) || methodParameter.getParameterType().getName().equals(HttpServletResponse.class.getName())) {
43                             continue;
44                         }
45                         ReflectionUtils.doWithFields(methodParameter.getParameterType(), fieldCallback,
46                                 field -> !field.getName().equalsIgnoreCase("serialVersionUID"));
47                     } else if (methodParameter.hasParameterAnnotation(RequestParam.class)) {
48                         RequestParam requestParamAnnotation =
49                                 methodParameter.getParameterAnnotation(RequestParam.class);
50                         ApiParam apiParam = methodParameter.getParameterAnnotation(ApiParam.class);
51                         Param param = new Param();
52                         param.setName(requestParamAnnotation.name());
53                         param.setRequired(requestParamAnnotation.required() ? "是" : "否");
54                         param.setType(methodParameter.getParameterType().getTypeName());
55                         param.setDescription(apiParam == null ? "" : apiParam.value());
56                         params.add(param);
57                     }
58                 }
59                 velocityTemplate.setParams(params);
60                 urlList.add(velocityTemplate);
61             }
62         }
63         GenerateWikiApiDocument.generateFile(urlList, "Statistics");
64         return urlList;
65     }
getAllUrl
 1 public static void generateFile(List<VelocityTemplate> velocityTemplates, String controllerClass) throws IOException {
 2         String basePath = "C:\\api\\";
 3         FileWriter file = new FileWriter(basePath + controllerClass +"API.md", false);
 4         BufferedWriter bufferedWriter = new BufferedWriter(file);
 5         //设置velocity资源加载器
 6         Properties prop = new Properties();
 7         prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader" );
 8         Velocity.init(prop);
 9 
10         Map<String, List<VelocityTemplate>> listMap = new HashMap<>();
11         listMap.put("list", velocityTemplates);
12         VelocityContext context = new VelocityContext(listMap);
13         String templatePath = "velocity/swagger.md.vm";
14         Template tpl = Velocity.getTemplate(templatePath, "UTF-8" );
15         tpl.merge(context, bufferedWriter);
16         bufferedWriter.close();
17         file.close();
18     }
GenerateWikiApiDocument#generateFile
 1 #foreach($item in $list)
 2 ${item.title}
 3 
 4 
 5 <table>
 6     <tr>
 7         <td>URL</td>
 8         <td colspan="4">${item.urlName}</td>
 9     </tr>
10     <tr>
11         <td>请求方式</td>
12         <td colspan="4">${item.requestMethod}</td>
13     </tr>
14     <tr>
15         <td>方法名</td>
16         <td colspan="4">${item.description}</td>
17     </tr>
18     <tr>
19         #set($size=${item.params.size()} + 3)
20         <td rowspan="$size">参数格式</td>
21         <td>字段</td>
22         <td>字段类型</td>
23         <td>是否必填</td>
24         <td>说明</td>
25     </tr>
26     #foreach($param in $item.params)
27     <tr>
28         <td>${param.name}</td>
29         <td>${param.type}</td>
30         <td>${param.required}</td>
31         <td>${param.description}</td>
32     </tr>
33     #end
34      <tr>
35         <td>请求参数</td>
36         <td colspan="3">${item.request}</td>
37     </tr>
38     <tr>
39         <td>返回参数</td>
40         <td colspan="3">${item.response}</td>
41     </tr>
42 </table>
43 
44 #end
velocitytemplate