获取所有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 }
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 }
@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 }
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 }
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