From 6408f0e7d26e3d220119059fe8a8e200d00533e6 Mon Sep 17 00:00:00 2001 From: tanghc Date: Mon, 26 Aug 2019 17:22:42 +0800 Subject: [PATCH] 2.0 --- .../storyweb/controller/AlipayController.java | 19 +++ .../gitee/sop/storyweb/vo/FileUploadVO.java | 4 + .../manager/SwaggerDocParser.java | 138 +++++++++++++----- 3 files changed, 121 insertions(+), 40 deletions(-) diff --git a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java index b5e1ea49..5d9cf5f3 100644 --- a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java +++ b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/controller/AlipayController.java @@ -17,7 +17,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import java.util.Arrays; import java.util.Date; +import java.util.List; /** * 支付宝服务端,假设签名验证通过后,到达这里进行具体的业务处理。 @@ -180,6 +182,23 @@ public class AlipayController { return storyVO; } + @ApiOperation(value = "返回数组结果", notes = "返回数组结果") + @ApiMapping(value = "alipay.story.find2") + public List getStory3(StoryParam story) { + int index = 0; + StoryVO storyVO = new StoryVO(); + storyVO.id = 1L; + storyVO.name = "白雪公主, index:" + index++; + storyVO.gmt_create = new Date(); + + StoryVO storyVO2 = new StoryVO(); + storyVO2.id = 1L; + storyVO2.name = "白雪公主, index:" + index++; + storyVO2.gmt_create = new Date(); + + return Arrays.asList(storyVO, storyVO2); + } + /** * 演示文档表格树 * @param story diff --git a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/vo/FileUploadVO.java b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/vo/FileUploadVO.java index 6367cb08..fcfafad7 100644 --- a/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/vo/FileUploadVO.java +++ b/sop-example/sop-story/sop-story-web/src/main/java/com/gitee/sop/storyweb/vo/FileUploadVO.java @@ -1,5 +1,6 @@ package com.gitee.sop.storyweb.vo; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.ArrayList; @@ -25,8 +26,11 @@ public class FileUploadVO { public FileMeta() { } + @ApiModelProperty(value = "文件名称", example = "1.txt") private String filename; + @ApiModelProperty(value = "文件大小", example = "109") private long size; + @ApiModelProperty(value = "文件内容", example = "啊啊啊") private String content; } } diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java index 7c5a99b8..0d7dc8ae 100644 --- a/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java +++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/manager/SwaggerDocParser.java @@ -8,7 +8,6 @@ import com.gitee.sop.websiteserver.bean.DocModule; import com.gitee.sop.websiteserver.bean.DocParameter; import com.gitee.sop.websiteserver.bean.DocParserContext; import com.google.common.collect.Sets; -import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import java.util.ArrayList; @@ -138,7 +137,7 @@ public class SwaggerDocParser implements DocParser { }) .collect(Collectors.groupingBy(DocParameter::getModule)); - collect.entrySet().stream() + collect.entrySet() .forEach(entry -> { DocParameter moduleDoc = new DocParameter(); moduleDoc.setName(entry.getKey()); @@ -147,18 +146,25 @@ public class SwaggerDocParser implements DocParser { docParameterList.add(moduleDoc); }); - List ret = docParameterList.stream() + return docParameterList.stream() .filter(docParameter -> !docParameter.getName().contains(".")) .collect(Collectors.toList()); - - return ret; } protected List buildResponseParameterList(JSONObject docInfo, JSONObject docRoot) { - String responseRef = getResponseRef(docInfo); + RefInfo refInfo = getResponseRefInfo(docInfo); List respParameterList = Collections.emptyList(); - if (StringUtils.isNotBlank(responseRef)) { + if (refInfo != null) { + String responseRef = refInfo.ref; respParameterList = this.buildDocParameters(responseRef, docRoot); + // 如果返回数组 + if (refInfo.isArray) { + DocParameter docParameter = new DocParameter(); + docParameter.setName("items"); + docParameter.setType("array"); + docParameter.setRefs(respParameterList); + respParameterList = Collections.singletonList(docParameter); + } } return respParameterList; } @@ -170,52 +176,104 @@ public class SwaggerDocParser implements DocParser { List docParameterList = new ArrayList<>(); for (String fieldName : fieldNames) { /* - { - "description": "分类故事", - "$ref": "#/definitions/StoryVO", - "originalRef": "StoryVO" + { + "description": "分类故事", + "$ref": "#/definitions/StoryVO" } */ JSONObject fieldInfo = properties.getJSONObject(fieldName); - DocParameter respParam = fieldInfo.toJavaObject(DocParameter.class); - respParam.setName(fieldName); - docParameterList.add(respParam); - String originalRef = isArray(fieldInfo) ? getRef(fieldInfo.getJSONObject(fieldName)) : getRef(fieldInfo); - if (StringUtils.isNotBlank(originalRef)) { - List refs = buildDocParameters(originalRef, docRoot); - respParam.setRefs(refs); + DocParameter docParameter = fieldInfo.toJavaObject(DocParameter.class); + docParameter.setName(fieldName); + docParameterList.add(docParameter); + RefInfo refInfo = this.getRefInfo(fieldInfo); + if (refInfo != null) { + List refs = buildDocParameters(refInfo.ref, docRoot); + docParameter.setRefs(refs); } } return docParameterList; } - protected boolean isArray(JSONObject fieldInfo) { - return "array".equalsIgnoreCase(fieldInfo.getString("type")); - } - - private String getRef(JSONObject fieldInfo) { - return Optional.ofNullable(fieldInfo) - .map(jsonObject -> jsonObject.getString("originalRef")) - .orElse(null); - } - protected String getResponseRef(JSONObject docInfo) { + /** + * 简单对象返回: + * "responses": { + * "200": { + * "description": "OK", + * "schema": { + * "$ref": "#/definitions/FileUploadVO" + * } + * }, + * "401": { + * "description": "Unauthorized" + * }, + * "403": { + * "description": "Forbidden" + * }, + * "404": { + * "description": "Not Found" + * } + * } + * 纯数组返回: + * "responses": { + * "200": { + * "description": "OK", + * "schema": { + * "type": "array", + * "items": { + * "$ref": "#/definitions/StoryVO" + * } + * } + * }, + * "401": { + * "description": "Unauthorized" + * }, + * "403": { + * "description": "Forbidden" + * }, + * "404": { + * "description": "Not Found" + * } + * } + * @param docInfo + * @return + */ + protected RefInfo getResponseRefInfo(JSONObject docInfo) { return Optional.ofNullable(docInfo.getJSONObject("responses")) .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("200"))) .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("schema"))) - .flatMap(jsonObject -> { - // #/definitions/Category - String $ref = jsonObject.getString("$ref"); - if ($ref == null) { - return Optional.empty(); - } - int index = $ref.lastIndexOf("/"); - if (index > -1) { - $ref = $ref.substring(index + 1); - } - return Optional.of($ref); + .flatMap(schema -> { + RefInfo refInfo = getRefInfo(schema); + return Optional.ofNullable(refInfo); }) - .orElse(""); + .orElse(null); + } + + private RefInfo getRefInfo(JSONObject jsonObject) { + String $ref; + boolean isArray = "array".equals(jsonObject.getString("type")); + if (isArray) { + $ref = jsonObject.getJSONObject("items").getString("$ref"); + } else { + // #/definitions/Category + $ref = jsonObject.getString("$ref"); + } + if ($ref == null) { + return null; + } + int index = $ref.lastIndexOf("/"); + if (index > -1) { + $ref = $ref.substring(index + 1); + } + RefInfo refInfo = new RefInfo(); + refInfo.isArray = isArray; + refInfo.ref = $ref; + return refInfo; + } + + private static class RefInfo { + private boolean isArray; + private String ref; } }