diff --git a/CHANGELOG.md b/CHANGELOG.md index 74232b3e..d839a86b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ ## smart-doc版本 版本小于1.0都属于试用,正式1.0起始发布将会等到文中提到的问题解决后才发布。 +#### 版本号:2.1.4 +- 更新日期: 2020-04-24 +- 更新内容: + 1. 修复Controller继承时,父类的Mapping未继承的问题。 + 2. 修复配置responseBodyAdvice后,controller中void方法返回显示错误。 + 3. 修复往torna推送漏掉pathParams的问题。 + 4. 修复非json请求集合中绑定枚举强制检查错误的问题。 + 5. 新增requestBodyAdvice支持,可以实现请求参数包装。 + 6. 修复泛型为List数据时,类型为object问题。 + 7. 修复customFiled为继承参数时配置失效问题。 #### 版本号:2.1.3 - 更新日期: 2020-04-11 - 更新内容: diff --git a/src/main/java/com/power/doc/builder/HtmlApiDocBuilder.java b/src/main/java/com/power/doc/builder/HtmlApiDocBuilder.java index 1902e2fe..6603e7b5 100644 --- a/src/main/java/com/power/doc/builder/HtmlApiDocBuilder.java +++ b/src/main/java/com/power/doc/builder/HtmlApiDocBuilder.java @@ -77,14 +77,18 @@ public static void buildApiDoc(ApiConfig config, JavaProjectBuilder javaProjectB Template indexCssTemplate = BeetlTemplateUtil.getByName(ALL_IN_ONE_CSS); FileUtil.nioWriteFile(indexCssTemplate.render(), config.getOutPath() + FILE_SEPARATOR + ALL_IN_ONE_CSS); if (config.isAllInOne()) { - if (StringUtils.isNotEmpty(config.getAllInOneDocFileName())) { - INDEX_HTML = config.getAllInOneDocFileName(); - } if (config.isCreateDebugPage()) { - builderTemplate.buildAllInOne(apiDocList, config, javaProjectBuilder, DEBUG_PAGE_ALL_TPL, DEBUG_PAGE_ALL_TPL); + INDEX_HTML = DEBUG_PAGE_ALL_TPL; + if (StringUtils.isNotEmpty(config.getAllInOneDocFileName())) { + INDEX_HTML = config.getAllInOneDocFileName(); + } + builderTemplate.buildAllInOne(apiDocList, config, javaProjectBuilder, DEBUG_PAGE_ALL_TPL, INDEX_HTML); Template mockJs = BeetlTemplateUtil.getByName(DEBUG_JS_TPL); FileUtil.nioWriteFile(mockJs.render(), config.getOutPath() + FILE_SEPARATOR + DEBUG_JS_OUT); } else { + if (StringUtils.isNotEmpty(config.getAllInOneDocFileName())) { + INDEX_HTML = config.getAllInOneDocFileName(); + } builderTemplate.buildAllInOne(apiDocList, config, javaProjectBuilder, ALL_IN_ONE_HTML_TPL, INDEX_HTML); } builderTemplate.buildSearchJs(config, javaProjectBuilder, apiDocList, SEARCH_ALL_JS_TPL); diff --git a/src/main/java/com/power/doc/builder/ProjectDocConfigBuilder.java b/src/main/java/com/power/doc/builder/ProjectDocConfigBuilder.java index 670668bd..845c1f56 100644 --- a/src/main/java/com/power/doc/builder/ProjectDocConfigBuilder.java +++ b/src/main/java/com/power/doc/builder/ProjectDocConfigBuilder.java @@ -90,7 +90,8 @@ public ProjectDocConfigBuilder(ApiConfig apiConfig, JavaProjectBuilder javaProje this.initCustomRequestFieldsMap(apiConfig); this.initReplaceClassMap(apiConfig); this.initConstants(apiConfig); - this.checkResponseBodyAdvice(apiConfig); + this.checkBodyAdvice(apiConfig.getRequestBodyAdvice()); + this.checkBodyAdvice(apiConfig.getResponseBodyAdvice()); } public JavaClass getClassByName(String simpleName) { @@ -179,20 +180,18 @@ private void initConstants(ApiConfig config) { } } - private void checkResponseBodyAdvice(ApiConfig config) { - ResponseBodyAdvice responseBodyAdvice = config.getResponseBodyAdvice(); - if (Objects.nonNull(responseBodyAdvice) && StringUtil.isNotEmpty(responseBodyAdvice.getClassName())) { - if (Objects.nonNull(responseBodyAdvice.getWrapperClass())) { + private void checkBodyAdvice(BodyAdvice bodyAdvice) { + if (Objects.nonNull(bodyAdvice) && StringUtil.isNotEmpty(bodyAdvice.getClassName())) { + if (Objects.nonNull(bodyAdvice.getWrapperClass())) { return; } try { - Class.forName(responseBodyAdvice.getClassName()); + Class.forName(bodyAdvice.getClassName()); } catch (ClassNotFoundException e) { - throw new RuntimeException("Can't find class " + responseBodyAdvice.getClassName() + " for ResponseBodyAdvice."); + throw new RuntimeException("Can't find class " + bodyAdvice.getClassName() + " for ResponseBodyAdvice."); } } } - /** * 设置高亮样式 */ diff --git a/src/main/java/com/power/doc/constants/DocTags.java b/src/main/java/com/power/doc/constants/DocTags.java index 79c9404a..18c2a8fe 100644 --- a/src/main/java/com/power/doc/constants/DocTags.java +++ b/src/main/java/com/power/doc/constants/DocTags.java @@ -112,4 +112,6 @@ public interface DocTags { * Ignore ResponseBodyAdvice */ String IGNORE_RESPONSE_BODY_ADVICE = "ignoreResponseBodyAdvice"; + + String IGNORE_REQUEST_BODY_ADVICE = "ignoreRequestBodyAdvice"; } diff --git a/src/main/java/com/power/doc/model/ApiConfig.java b/src/main/java/com/power/doc/model/ApiConfig.java index 73873d9b..517c6706 100644 --- a/src/main/java/com/power/doc/model/ApiConfig.java +++ b/src/main/java/com/power/doc/model/ApiConfig.java @@ -268,7 +268,9 @@ public class ApiConfig { * Support Spring MVC ResponseBodyAdvice * @since 1.9.8 */ - private ResponseBodyAdvice responseBodyAdvice; + private BodyAdvice responseBodyAdvice; + + private BodyAdvice requestBodyAdvice; private String style; @@ -718,14 +720,22 @@ public void setDisplayActualType(boolean displayActualType) { this.displayActualType = displayActualType; } - public ResponseBodyAdvice getResponseBodyAdvice() { + public BodyAdvice getResponseBodyAdvice() { return responseBodyAdvice; } - public void setResponseBodyAdvice(ResponseBodyAdvice responseBodyAdvice) { + public void setResponseBodyAdvice(BodyAdvice responseBodyAdvice) { this.responseBodyAdvice = responseBodyAdvice; } + public BodyAdvice getRequestBodyAdvice() { + return requestBodyAdvice; + } + + public void setRequestBodyAdvice(BodyAdvice requestBodyAdvice) { + this.requestBodyAdvice = requestBodyAdvice; + } + public String getStyle() { return style; } diff --git a/src/main/java/com/power/doc/model/ResponseBodyAdvice.java b/src/main/java/com/power/doc/model/BodyAdvice.java similarity index 84% rename from src/main/java/com/power/doc/model/ResponseBodyAdvice.java rename to src/main/java/com/power/doc/model/BodyAdvice.java index fedefdb6..1e2a726d 100644 --- a/src/main/java/com/power/doc/model/ResponseBodyAdvice.java +++ b/src/main/java/com/power/doc/model/BodyAdvice.java @@ -26,7 +26,7 @@ * @since 1.9.8 * @author yu 2020/11/5. */ -public class ResponseBodyAdvice { +public class BodyAdvice { private String className; @@ -34,15 +34,15 @@ public class ResponseBodyAdvice { private String dataField; - public static ResponseBodyAdvice builder(){ - return new ResponseBodyAdvice(); + public static BodyAdvice builder(){ + return new BodyAdvice(); } public String getClassName() { return className; } - public ResponseBodyAdvice setClassName(String className) { + public BodyAdvice setClassName(String className) { this.className = className; return this; } @@ -51,7 +51,7 @@ public String getDataField() { return dataField; } - public ResponseBodyAdvice setDataField(String dataField) { + public BodyAdvice setDataField(String dataField) { this.dataField = dataField; return this; } @@ -60,7 +60,7 @@ public Class getWrapperClass() { return wrapperClass; } - public ResponseBodyAdvice setWrapperClass(Class wrapperClass) { + public BodyAdvice setWrapperClass(Class wrapperClass) { this.wrapperClass = wrapperClass; return this; } diff --git a/src/main/java/com/power/doc/template/IDocBuildTemplate.java b/src/main/java/com/power/doc/template/IDocBuildTemplate.java index fc7b1e41..c94e1684 100644 --- a/src/main/java/com/power/doc/template/IDocBuildTemplate.java +++ b/src/main/java/com/power/doc/template/IDocBuildTemplate.java @@ -96,7 +96,7 @@ default void handleApiDoc(JavaClass cls, List apiDocList, List buildReturnApiParams(DocJavaMethod docJavaMethod, ProjectDocConfigBuilder projectBuilder) { JavaMethod method = docJavaMethod.getJavaMethod(); - if (method.getReturns().isVoid()) { + if (method.getReturns().isVoid() && Objects.isNull(projectBuilder.getApiConfig().getResponseBodyAdvice())) { return new ArrayList<>(0); } String returnTypeGenericCanonicalName = method.getReturnType().getGenericCanonicalName(); diff --git a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java index 1c82ffd7..3d92c3d6 100644 --- a/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java +++ b/src/main/java/com/power/doc/template/SpringBootDocBuildTemplate.java @@ -46,7 +46,7 @@ import static com.power.doc.constants.DocGlobalConstants.FILE_CONTENT_TYPE; import static com.power.doc.constants.DocGlobalConstants.JSON_CONTENT_TYPE; -import static com.power.doc.constants.DocTags.IGNORE; +import static com.power.doc.constants.DocTags.*; /** * @author yu 2019/12/21. @@ -120,7 +120,7 @@ private List buildControllerMethod(final JavaClass cls, ApiConfig boolean paramsDataToTree = projectBuilder.getApiConfig().isParamsDataToTree(); String group = JavaClassUtil.getClassTagsValue(cls, DocTags.GROUP, Boolean.TRUE); String classAuthor = JavaClassUtil.getClassTagsValue(cls, DocTags.AUTHOR, Boolean.TRUE); - List classAnnotations = cls.getAnnotations(); + List classAnnotations = this.getAnnotations(cls); Map constantsMap = projectBuilder.getConstantsMap(); String baseUrl = ""; for (JavaAnnotation annotation : classAnnotations) { @@ -365,6 +365,19 @@ private ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc ap } if (SpringMvcAnnotations.REQUEST_BODY.equals(annotationName) || DocGlobalConstants.REQUEST_BODY_FULLY.equals(annotationName)) { apiMethodDoc.setContentType(JSON_CONTENT_TYPE); + if (Objects.nonNull(configBuilder.getApiConfig().getRequestBodyAdvice()) + && Objects.isNull(method.getTagByName(IGNORE_REQUEST_BODY_ADVICE))) { + String requestBodyAdvice = configBuilder.getApiConfig().getRequestBodyAdvice().getClassName(); + gicTypeName = new StringBuffer() + .append(requestBodyAdvice) + .append("<") + .append(gicTypeName).append(">").toString(); + typeName = new StringBuffer() + .append(requestBodyAdvice) + .append("<") + .append(typeName).append(">").toString(); + } + if (JavaClassValidateUtil.isPrimitive(simpleTypeName)) { StringBuilder builder = new StringBuilder(); builder.append("{\"") @@ -411,7 +424,8 @@ private ApiRequestExample buildReqJson(DocJavaMethod javaMethod, ApiMethodDoc ap if (JavaClassValidateUtil.isArray(gicName)) { gicName = gicName.substring(0, gicName.indexOf("[")); } - if (!JavaClassValidateUtil.isPrimitive(gicName)) { + if (!JavaClassValidateUtil.isPrimitive(gicName) + &&!configBuilder.getJavaProjectBuilder().getClassByName(gicName).isEnum()) { throw new RuntimeException("Spring MVC can't support binding Collection on method " + method.getName() + "Check it in " + method.getDeclaringClass().getCanonicalName()); } @@ -667,14 +681,29 @@ private ApiMethodReqParam requestParams(final DocJavaMethod docJavaMethod, Proje if (JavaClassValidateUtil.isArray(gicName)) { gicName = gicName.substring(0, gicName.indexOf("[")); } - if (JavaClassValidateUtil.isPrimitive(gicName)) { + JavaClass gicJavaClass = builder.getJavaProjectBuilder().getClassByName(gicName); + if(gicJavaClass.isEnum()){ + Object value = JavaClassUtil.getEnumValue(gicJavaClass, Boolean.TRUE); + ApiParam param = ApiParam.of().setField(paramName).setDesc(comment + ",[array of enum]") + .setRequired(required) + .setPathParam(isPathVariable) + .setQueryParam(queryParam) + .setId(paramList.size() + 1) + .setType("array").setValue(String.valueOf(value)); + paramList.add(param); + if (requestBodyCounter > 0) { + Map map = OpenApiSchemaUtil.arrayTypeSchema(gicName); + docJavaMethod.setRequestSchema(map); + } + } else if (JavaClassValidateUtil.isPrimitive(gicName)) { String shortSimple = DocClassUtil.processTypeNameForParams(gicName); ApiParam param = ApiParam.of().setField(paramName).setDesc(comment + ",[array of " + shortSimple + "]") .setRequired(required) .setPathParam(isPathVariable) .setQueryParam(queryParam) .setId(paramList.size() + 1) - .setType("array"); + .setType("array") + .setValue(DocUtil.getValByTypeAndFieldName(gicName,paramName)); paramList.add(param); if (requestBodyCounter > 0) { Map map = OpenApiSchemaUtil.arrayTypeSchema(gicName); @@ -878,4 +907,25 @@ private void mappingParamToApiParam(String str, List paramList, Map getAnnotations(JavaClass cls) { + List annotationsList = cls.getAnnotations(); + boolean flag = annotationsList.stream().anyMatch(item -> { + String annotationName = item.getType().getValue(); + if (DocAnnotationConstants.REQUEST_MAPPING.equals(annotationName) || + DocGlobalConstants.REQUEST_MAPPING_FULLY.equals(annotationName)) { + return true; + } + return false; + }); + // child override parent set + if (flag) { + return annotationsList; + } + JavaClass superJavaClass = cls.getSuperJavaClass(); + if (!"Object".equals(superJavaClass.getSimpleName())) { + annotationsList.addAll(getAnnotations(superJavaClass)); + } + return annotationsList; + } }