浏览代码

[*]优化swagger文档多层级嵌套问题

Lianjy 4 年之前
父节点
当前提交
5a91e67738
共有 1 个文件被更改,包括 22 次插入19 次删除
  1. 22 19
      magic-api/src/main/java/org/ssssssss/magicapi/swagger/SwaggerProvider.java

+ 22 - 19
magic-api/src/main/java/org/ssssssss/magicapi/swagger/SwaggerProvider.java

@@ -78,7 +78,7 @@ public class SwaggerProvider {
 				hasBody = parameters.stream().anyMatch(it -> VAR_NAME_REQUEST_BODY.equals(it.getIn()));
 				BaseDefinition baseDefinition = info.getRequestBodyDefinition();
                 if (hasBody && baseDefinition != null) {
-                    doProcessDefinition(baseDefinition, info, StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY), "request");
+                    doProcessDefinition(baseDefinition, info, "root_" + baseDefinition.getName() , "request", 0);
                 }
 				baseDefinition = info.getResponseBodyDefinition();
 				parameters.forEach(path::addParameter);
@@ -86,7 +86,7 @@ public class SwaggerProvider {
 					Map responseMap = parseResponse(info);
 					if (!responseMap.isEmpty()) {
 						path.setResponses(responseMap);
-						doProcessDefinition(baseDefinition, info, StringUtils.defaultIfBlank(baseDefinition.getName(), "responseData"), "response");
+						doProcessDefinition(baseDefinition, info, "root_" + baseDefinition.getName(), "response", 0);
 					}
 				}else{
 					 path.addResponse("200", mapper.readValue(Objects.toString(info.getResponseBody(), BODY_EMPTY), Object.class));
@@ -138,9 +138,9 @@ public class SwaggerProvider {
 				String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
 				String voName =  groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "«request«";
 				if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(baseDefinition.getDataType().getJavascriptType())) {
-					voName += StringUtils.defaultIfBlank(baseDefinition.getChildren().get(0).getName(), VAR_NAME_REQUEST_BODY + "_" + StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY)) + "»»»";
+					voName += "root_" + (StringUtils.isNotBlank(baseDefinition.getChildren().get(0).getName()) ? "_" + baseDefinition.getChildren().get(0).getName() : "") +  "»»»";
 				} else {
-					voName += StringUtils.defaultIfBlank(baseDefinition.getName(), VAR_NAME_REQUEST_BODY) + "»»»";
+					voName += "root_" + baseDefinition.getName() + "»»»";
 				}
 
 				schema.put("originalRef", voName);
@@ -166,7 +166,7 @@ public class SwaggerProvider {
 		if (baseDefinition.getChildren().size() > 0) {
 			String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
 			String voName =  groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + "«response«";
-			voName += StringUtils.defaultIfBlank(baseDefinition.getName(), "responseData") + "»»»";
+			voName += "root_" + baseDefinition.getName() + "»»»";
 
 			Map<String, Object> schema = new HashMap<>(2);
 			schema.put("originalRef", voName);
@@ -180,35 +180,38 @@ public class SwaggerProvider {
 
 		return result;
 	}
-    private Map<String, Object> doProcessDefinition(BaseDefinition target, ApiInfo info, String parentName, String definitionType) {
-        Map<String, Object> result = new HashMap<>(4);
+    private Map<String, Object> doProcessDefinition(BaseDefinition target, ApiInfo info, String parentName, String definitionType, int level) {
+        Map<String, Object> result = new HashMap<>(3);
         result.put("description", target.getDescription());
         if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY.equalsIgnoreCase(target.getDataType().getJavascriptType())) {
             if (target.getChildren().size() > 0) {
-                result.put("items", doProcessDefinition(target.getChildren().get(0), info, parentName + "_" + StringUtils.defaultIfBlank(target.getName(), VAR_NAME_REQUEST_BODY_VALUE_TYPE_ARRAY), definitionType));
+                result.put("items", doProcessDefinition(target.getChildren().get(0), info, parentName + target.getName() + "_", definitionType, level + 1));
             } else {
                 result.put("items", Collections.emptyList());
             }
 			result.put("type", target.getDataType().getJavascriptType());
         } else if (VAR_NAME_REQUEST_BODY_VALUE_TYPE_OBJECT.equalsIgnoreCase(target.getDataType().getJavascriptType())) {
             String groupName = groupServiceProvider.getFullName(info.getGroupId()).replace("/", "-");
-            String voName = groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + (StringUtils.equals("response", definitionType) ? "«response«" : "«request«") + StringUtils.defaultIfBlank(target.getName(), parentName)  + "»»»";
+            String voName = groupName + "«" + info.getPath().replaceFirst("/", "").replaceAll("/", "_") + (StringUtils.equals("response", definitionType) ? "«response«" : "«request«") + parentName + target.getName()  + "»»»";
+
+			Map<String, Object> definition = new HashMap<>(3);
+			Map<String, Map<String, Object>> properties = new HashMap<>(target.getChildren().size());
+			for (BaseDefinition obj : target.getChildren()) {
+				properties.put(obj.getName(), doProcessDefinition(obj, info, parentName + target.getName() + "_", definitionType, level + 1));
+			}
+			definition.put("properties", properties);
+			definition.put("description", target.getDescription());
+			definition.put("type", target.getDataType().getJavascriptType());
+
             if (this.DEFINITION_MAP.containsKey(voName)) {
 				// TODO 应该不会出现名字都一样的
-				voName.replace("»»»", "_" + parentName + "»»»");
+				voName = voName.replace("»»»", "_" + level + "»»»");
 			}
+
+			this.DEFINITION_MAP.put(voName, definition);
             result.put("originalRef", voName);
             result.put("$ref", DEFINITION + voName);
 
-            Map<String, Object> definition = new HashMap<>(4);
-            Map<String, Map<String, Object>> properties = new HashMap<>(target.getChildren().size());
-            for (BaseDefinition obj : target.getChildren()) {
-                properties.put(obj.getName(), doProcessDefinition(obj, info, parentName, definitionType));
-            }
-            definition.put("properties", properties);
-            definition.put("description", target.getDescription());
-			definition.put("type", target.getDataType().getJavascriptType());
-            this.DEFINITION_MAP.put(voName, definition);
         } else {
             result.put("example", target.getValue());
 			result.put("type", target.getDataType().getJavascriptType());