From 1a9a64eb03b3b4f3d3bea6ce421b1b06d41cc864 Mon Sep 17 00:00:00 2001 From: yusun4 Date: Fri, 23 Oct 2020 22:54:43 +0800 Subject: [PATCH] fix #59. --- CHANGELOG.md | 3 +- pom.xml | 2 +- .../SpringMVCRequestHeaderHandler.java | 68 ++++++++++++++++--- .../template/SpringBootDocBuildTemplate.java | 1 - 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6131c3b..6e6baa5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,13 @@ ## smart-doc版本 版本小于1.0都属于试用,正式1.0起始发布将会等到文中提到的问题解决后才发布。 #### 版本号:1.9.7 -- 更新日期: 2020-10-19 +- 更新日期: 2020-10-24 - 更新内容: 1. 修复restful接口泛型中使用?时的解析错误。 2. 优化rpc html非all in one的问题。 3. 对rest query参数自动添加描述,增加可读性。 4. support ali dubbo,#I22CF7 . + 5. support @RequestMapping headers. #### 版本号:1.9.6 - 更新日期: 2020-10-09 - 更新内容: diff --git a/pom.xml b/pom.xml index 1099781..f254caa 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 smart-doc jar - 1.9.6 + 1.9.7 smart-doc https://github.com/smart-doc-group/smart-doc.git diff --git a/src/main/java/com/power/doc/handler/SpringMVCRequestHeaderHandler.java b/src/main/java/com/power/doc/handler/SpringMVCRequestHeaderHandler.java index 1cdf5dc..9026b2b 100644 --- a/src/main/java/com/power/doc/handler/SpringMVCRequestHeaderHandler.java +++ b/src/main/java/com/power/doc/handler/SpringMVCRequestHeaderHandler.java @@ -23,19 +23,18 @@ package com.power.doc.handler; import com.power.common.util.StringUtil; -import com.power.doc.constants.DocAnnotationConstants; -import com.power.doc.constants.DocTags; -import com.power.doc.constants.SpringMvcAnnotations; +import com.power.doc.constants.*; import com.power.doc.model.ApiReqHeader; import com.power.doc.utils.DocClassUtil; import com.power.doc.utils.DocUtil; import com.thoughtworks.qdox.model.JavaAnnotation; import com.thoughtworks.qdox.model.JavaMethod; import com.thoughtworks.qdox.model.JavaParameter; +import com.thoughtworks.qdox.model.expression.AnnotationValue; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author yu 2019/12/22. @@ -49,7 +48,42 @@ public class SpringMVCRequestHeaderHandler { * @return list of ApiReqHeader */ public List handle(JavaMethod method) { - List apiReqHeaders = new ArrayList<>(); + List mappingHeaders = new ArrayList<>(); + List annotations = method.getAnnotations(); + for (JavaAnnotation annotation : annotations) { + String annotationName = annotation.getType().getName(); + if (!isMapping(annotationName)) { + continue; + } + Object headersObject = annotation.getNamedParameter("headers"); + List headers = (LinkedList) headersObject; + for (String str : headers) { + String header = StringUtil.removeQuotes(str); + if (header.startsWith("!")) { + continue; + } + if (header.contains("!=")) { + String headerName = header.substring(0, header.indexOf("!")); + ApiReqHeader apiReqHeader = ApiReqHeader.builder().setName(headerName) + .setRequired(true).setValue(null).setDesc(header).setType("string"); + mappingHeaders.add(apiReqHeader); + } else { + String headerName; + String headerValue = null; + if (header.contains("=")) { + int index = header.indexOf("="); + headerName = header.substring(0, header.indexOf("=")); + headerValue = header.substring(index + 1); + } else { + headerName = header; + } + ApiReqHeader apiReqHeader = ApiReqHeader.builder().setName(headerName) + .setRequired(true).setValue(headerValue).setDesc(header).setType("string"); + mappingHeaders.add(apiReqHeader); + } + } + } + List reqHeaders = new ArrayList<>(); for (JavaParameter javaParameter : method.getParameters()) { List javaAnnotations = javaParameter.getAnnotations(); String className = method.getDeclaringClass().getCanonicalName(); @@ -84,11 +118,27 @@ public class SpringMVCRequestHeaderHandler { } String typeName = javaParameter.getType().getValue().toLowerCase(); apiReqHeader.setType(DocClassUtil.processTypeNameForParams(typeName)); - apiReqHeaders.add(apiReqHeader); + reqHeaders.add(apiReqHeader); break; } } } - return apiReqHeaders; + List allApiReqHeaders = Stream.of(mappingHeaders, reqHeaders) + .flatMap(Collection::stream).distinct().collect(Collectors.toList()); + return allApiReqHeaders; + } + + private boolean isMapping(String annotationName) { + switch (annotationName) { + case "GetMapping": + case "RequestMapping": + case "PostMapping": + case "PutMapping": + case "PatchMapping": + case "DeleteMapping": + return true; + default: + return false; + } } } diff --git a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java index c21f527..b9b35bf 100644 --- a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java +++ b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java @@ -163,7 +163,6 @@ public class SpringBootDocBuildTemplate implements IDocBuildTemplate { .handle(projectBuilder.getServerUrl(), baseUrl, method, constantsMap); //handle headers List apiReqHeaders = new SpringMVCRequestHeaderHandler().handle(method); - apiMethodDoc.setRequestHeaders(apiReqHeaders); if (Objects.nonNull(requestMapping)) { if (null != method.getTagByName(IGNORE)) { continue;