diff --git a/changelog.md b/changelog.md
index 27ea95c3..2fb8a76c 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,5 +1,10 @@
# changelog
+## 4.0.3
+
+- 可定义业务错误码(见`@Open`注解中的`bizCode`属性)
+- 文档参数可指定最大长度(使用`@Length(max = xx)`)
+
## 4.0.2
- 支持swagger排序(position属性)
diff --git a/doc/docs/files/10041_编写文档.md b/doc/docs/files/10041_编写文档.md
index 25ad741e..c17cdb5f 100644
--- a/doc/docs/files/10041_编写文档.md
+++ b/doc/docs/files/10041_编写文档.md
@@ -84,7 +84,11 @@ public class StoryResult {
* @return
*/
@ApiOperation(value = "获取故事信息", notes = "说明接口的详细信息,介绍,用途,注意事项等。")
-@Open(value = "alipay.story.find")
+@Open(value = "alipay.story.find", bizCode = {
+ // 定义业务错误码,用于文档显示
+ @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"),
+ @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"),
+ })
public StoryResult getStory2(StoryParam story) {
log.info("获取故事信息参数, story: {}", story);
// 获取其它参数
diff --git a/sop-admin/sop-admin-server/pom.xml b/sop-admin/sop-admin-server/pom.xml
index f49439d7..54b00d40 100644
--- a/sop-admin/sop-admin-server/pom.xml
+++ b/sop-admin/sop-admin-server/pom.xml
@@ -24,7 +24,7 @@
com.gitee.sop
sop-bridge-nacos
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-auth/pom.xml b/sop-auth/pom.xml
index c6406bf2..dde8a818 100644
--- a/sop-auth/pom.xml
+++ b/sop-auth/pom.xml
@@ -25,7 +25,7 @@
com.gitee.sop
sop-service-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-common/sop-bridge-eureka/pom.xml b/sop-common/sop-bridge-eureka/pom.xml
index f367b7a9..a21ae837 100644
--- a/sop-common/sop-bridge-eureka/pom.xml
+++ b/sop-common/sop-bridge-eureka/pom.xml
@@ -10,7 +10,7 @@
4.0.0
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
sop-bridge-eureka
@@ -18,7 +18,7 @@
com.gitee.sop
sop-gateway-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-common/sop-bridge-nacos/pom.xml b/sop-common/sop-bridge-nacos/pom.xml
index 822b8234..21504e9e 100644
--- a/sop-common/sop-bridge-nacos/pom.xml
+++ b/sop-common/sop-bridge-nacos/pom.xml
@@ -10,7 +10,7 @@
4.0.0
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
sop-bridge-nacos
@@ -18,7 +18,7 @@
com.gitee.sop
sop-gateway-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-common/sop-gateway-common/pom.xml b/sop-common/sop-gateway-common/pom.xml
index 0346be41..3b4d5df7 100644
--- a/sop-common/sop-gateway-common/pom.xml
+++ b/sop-common/sop-gateway-common/pom.xml
@@ -11,7 +11,7 @@
4.0.0
sop-gateway-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
jar
diff --git a/sop-common/sop-service-common/pom.xml b/sop-common/sop-service-common/pom.xml
index 91d00021..582ab35d 100644
--- a/sop-common/sop-service-common/pom.xml
+++ b/sop-common/sop-service-common/pom.xml
@@ -12,7 +12,7 @@
4.0.0
sop-service-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
jar
diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java
new file mode 100644
index 00000000..892df082
--- /dev/null
+++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/BizCode.java
@@ -0,0 +1,37 @@
+package com.gitee.sop.servercommon.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 错误码
+ *
+ * @author tanghc
+ */
+@Target(ElementType.ANNOTATION_TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface BizCode {
+
+ /**
+ * 错误码
+ *
+ * @return
+ */
+ String code();
+
+ /**
+ * 错误描述
+ * @return
+ */
+ String msg();
+
+ /**
+ * 解决方案
+ * @return
+ */
+ String solution() default "";
+}
diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java
index 661471fe..f2eb882d 100644
--- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java
+++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/annotation/Open.java
@@ -44,4 +44,9 @@ public @interface Open {
* 是否需要appAuthToken,设置为true,网关端会校验token是否存在
*/
boolean needToken() default false;
+
+ /**
+ * 定义业务错误码,用于文档显示
+ */
+ BizCode[] bizCode() default {};
}
diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java
index 217a3614..adb68d04 100644
--- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java
+++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/configuration/ServiceConfiguration.java
@@ -59,6 +59,21 @@ public class ServiceConfiguration implements WebMvcConfigurer {
registry.addInterceptor(new ServiceContextInterceptor());
}
+ @Bean
+ @ConditionalOnMissingBean
+ @ConditionalOnProperty("spring.cloud.nacos.discovery.server-addr")
+ public NacosWatch nacosWatch(NacosDiscoveryProperties nacosDiscoveryProperties, ObjectProvider taskScheduler, Environment environment) {
+ Map metadata = nacosDiscoveryProperties.getMetadata();
+ String contextPath = environment.getProperty("server.servlet.context-path");
+ // 将context-path信息加入到metadata中
+ if (contextPath != null) {
+ metadata.put("context-path", contextPath);
+ }
+ // 在元数据中新增启动时间,不能修改这个值,不然网关拉取接口会有问题
+ metadata.put("time.startup", String.valueOf(System.currentTimeMillis()));
+ return new NacosWatch(nacosDiscoveryProperties, taskScheduler);
+ }
+
@Bean
@ConditionalOnMissingBean
GlobalExceptionHandler globalExceptionHandler() {
diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java
index b3e4974b..e45ef2c3 100644
--- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java
+++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/CustomSwaggerParameterBuilder.java
@@ -6,9 +6,12 @@ import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
+import org.hibernate.validator.constraints.Length;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.service.AllowableListValues;
import springfox.documentation.service.AllowableValues;
+import springfox.documentation.service.StringVendorExtension;
+import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.schema.EnumTypeDeterminer;
import springfox.documentation.spi.service.ExpandedParameterBuilderPlugin;
@@ -18,6 +21,7 @@ import springfox.documentation.swagger.common.SwaggerPluginSupport;
import springfox.documentation.swagger.readers.parameter.Examples;
import springfox.documentation.swagger.schema.ApiModelProperties;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -76,6 +80,8 @@ public class CustomSwaggerParameterBuilder implements ExpandedParameterBuilderPl
.scalarExample(apiParam.example())
.complexExamples(Examples.examples(apiParam.examples()))
.order(SWAGGER_PLUGIN_ORDER)
+ // 添加额外属性
+ .vendorExtensions(this.getVendorExtension(context))
.build();
}
@@ -94,9 +100,22 @@ public class CustomSwaggerParameterBuilder implements ExpandedParameterBuilderPl
.scalarExample(apiModelProperty.example())
//源码这里是: SWAGGER_PLUGIN_ORDER,需要修正
.order(apiModelProperty.position())
+ // 添加额外属性
+ .vendorExtensions(this.getVendorExtension(context))
.build();
}
+ private List getVendorExtension(ParameterExpansionContext context) {
+ List vendorExtensions = new ArrayList<>(4);
+ Optional annotation = context.findAnnotation(Length.class);
+ if (annotation.isPresent()) {
+ Length length = annotation.get();
+ vendorExtensions.add(new StringVendorExtension("maxLength", String.valueOf(length.max())));
+ vendorExtensions.add(new StringVendorExtension("minLength", String.valueOf(length.min())));
+ }
+ return vendorExtensions;
+ }
+
private ParameterBuilder maybeSetParameterName(ParameterExpansionContext context, String parameterName) {
if (!Strings.isNullOrEmpty(parameterName)) {
context.getParameterBuilder().name(parameterName);
diff --git a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java
index a7ed04f3..c44c9d8a 100644
--- a/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java
+++ b/sop-common/sop-service-common/src/main/java/com/gitee/sop/servercommon/swagger/DocumentationPluginsManagerExt.java
@@ -1,10 +1,19 @@
package com.gitee.sop.servercommon.swagger;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.classmate.ResolvedType;
+import com.fasterxml.classmate.members.RawField;
+import com.gitee.sop.servercommon.annotation.BizCode;
import com.gitee.sop.servercommon.annotation.Open;
import com.gitee.sop.servercommon.bean.ServiceConfig;
import com.google.common.base.Optional;
import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.core.annotation.Order;
import springfox.documentation.service.Operation;
import springfox.documentation.service.StringVendorExtension;
@@ -12,7 +21,15 @@ import springfox.documentation.service.VendorExtension;
import springfox.documentation.spi.service.contexts.OperationContext;
import springfox.documentation.spring.web.plugins.DocumentationPluginsManager;
+import java.lang.reflect.Field;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
/**
* @author tanghc
@@ -23,6 +40,7 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager
private static final String SOP_VERSION = "sop_version";
private static final String MODULE_ORDER = "module_order";
private static final String API_ORDER = "api_order";
+ private static final String BIZ_CODE = "biz_code";
@Override
public Operation operation(OperationContext operationContext) {
@@ -40,6 +58,8 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager
String version = buildVersion(open.version());
vendorExtensions.add(new StringVendorExtension(SOP_NAME, name));
vendorExtensions.add(new StringVendorExtension(SOP_VERSION, version));
+ this.setBizCode(open, vendorExtensions);
+ this.setResultExtProperties(operationContext);
}
Optional apiOptional = operationContext.findControllerAnnotation(Api.class);
int order = 0;
@@ -60,6 +80,73 @@ public class DocumentationPluginsManagerExt extends DocumentationPluginsManager
vendorExtensions.add(new StringVendorExtension(API_ORDER, String.valueOf(methodOrder)));
}
+ /**
+ * 设置返回结果额外属性,如最大长度
+ * @param operationContext
+ */
+ private void setResultExtProperties(OperationContext operationContext) {
+ List vendorExtensions = operationContext.getDocumentationContext().getVendorExtentions();
+ ResolvedType returnType = operationContext.getReturnType();
+ Class> erasedType = returnType.getErasedType();
+ String className = erasedType.getSimpleName();
+ boolean exist = vendorExtensions.stream().anyMatch(p -> Objects.equals(p.getName(), className));
+ if (!exist) {
+ List memberFields = returnType.getMemberFields();
+ Map> fieldProperties = new HashMap<>(16);
+ for (RawField memberField : memberFields) {
+ String key = memberField.getName();
+ Length length = AnnotationUtils.findAnnotation(memberField.getRawMember(), Length.class);
+ if (length != null) {
+ Map properties = fieldProperties.computeIfAbsent(key, k -> new HashMap<>(16));
+ properties.computeIfAbsent("maxLength", k -> length.max());
+ properties.computeIfAbsent("minLength", k -> length.max());
+ }
+ ApiModelProperty apiModelProperty = AnnotationUtils.findAnnotation(memberField.getRawMember(), ApiModelProperty.class);
+ if (apiModelProperty != null) {
+ Map properties = fieldProperties.computeIfAbsent(key, k -> new HashMap<>(16));
+ boolean required = apiModelProperty.required();
+ // 只有在必填的情况下设置
+ if (required) {
+ properties.put("required", required);
+ }
+ }
+ }
+ vendorExtensions.add(new StringVendorExtension(className, JSON.toJSONString(fieldProperties)));
+ }
+ }
+
+ private Class> getGenericType(Field curField) {
+ // 当前集合的泛型类型
+ Type genericType = curField.getGenericType();
+ if (genericType instanceof ParameterizedType) {
+ ParameterizedType pt = (ParameterizedType) genericType;
+ // 得到泛型里的class类型对象
+ return (Class>) pt.getActualTypeArguments()[0];
+ }
+ return null;
+ }
+
+ /**
+ * 设置业务错误码
+ * @param open
+ * @param vendorExtensions
+ */
+ private void setBizCode(Open open, List vendorExtensions) {
+ BizCode[] bizCodes = open.bizCode();
+ List codeObjList = Stream.of(bizCodes)
+ .map(bizCode -> new BizCodeObj(bizCode.code(), bizCode.msg(), bizCode.solution()))
+ .collect(Collectors.toList());
+ vendorExtensions.add(new StringVendorExtension(BIZ_CODE, JSON.toJSONString(codeObjList)));
+ }
+
+ @Data
+ @AllArgsConstructor
+ private static class BizCodeObj {
+ private String code;
+ private String msg;
+ private String solution;
+ }
+
private String buildVersion(String version) {
if ("".equals(version)) {
return ServiceConfig.getInstance().getDefaultVersion();
diff --git a/sop-example/sop-springmvc/pom.xml b/sop-example/sop-springmvc/pom.xml
index 959313eb..23060d5d 100644
--- a/sop-example/sop-springmvc/pom.xml
+++ b/sop-example/sop-springmvc/pom.xml
@@ -26,7 +26,7 @@
com.gitee.sop
sop-service-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-example/sop-story/pom.xml b/sop-example/sop-story/pom.xml
index e0fe48be..1a0afa2f 100644
--- a/sop-example/sop-story/pom.xml
+++ b/sop-example/sop-story/pom.xml
@@ -19,7 +19,7 @@
com.gitee.sop
sop-service-common
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java
index a291d960..b2eb6e2c 100644
--- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java
+++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/Example1001_BaseController.java
@@ -1,5 +1,6 @@
package com.gitee.sop.storyweb.controller;
+import com.gitee.sop.servercommon.annotation.BizCode;
import com.gitee.sop.servercommon.annotation.Open;
import com.gitee.sop.storyweb.controller.param.CategoryParam;
import com.gitee.sop.storyweb.controller.param.LargeTextParam;
@@ -42,7 +43,11 @@ public class Example1001_BaseController {
// 基础用法
@ApiOperation(value = "获取故事信息(首位)", notes = "获取故事信息的详细信息", position = -100/* position默认0,值越小越靠前 */)
- @Open("story.get")
+ @Open(value = "story.get", bizCode = {
+ // 定义业务错误码,用于文档显示
+ @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"),
+ @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"),
+ })
@RequestMapping("/get/v1")
public StoryResult get_v1(StoryParam param) {
StoryResult story = new StoryResult();
@@ -53,7 +58,11 @@ public class Example1001_BaseController {
// 指定版本号
@ApiOperation(value = "获取故事信息", notes = "获取故事信息的详细信息")
- @Open(value = "story.get", version = "2.0")
+ @Open(value = "story.get", version = "2.0", bizCode = {
+ // 定义业务错误码,用于文档显示
+ @BizCode(code = "100001", msg = "姓名错误", solution = "填写正确的姓名"),
+ @BizCode(code = "100002", msg = "备注错误", solution = "填写正确备注"),
+ })
@RequestMapping("/get/v2")
public StoryResult get_v2(StoryParam param) {
StoryResult story = new StoryResult();
diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java
index 6095f7c9..84ae44ea 100644
--- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java
+++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/param/StoryParam.java
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
+import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;
@Data
@@ -17,5 +18,6 @@ public class StoryParam {
private String name;
@ApiModelProperty(value = "备注 (第二)", example = "xx", position = 2)
+ @Length(max = 64, message = "长度不能超过64")
private String remark;
}
\ No newline at end of file
diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java
index b3bf99ef..80f6f69b 100644
--- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java
+++ b/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/controller/result/StoryResult.java
@@ -12,10 +12,11 @@ import java.util.Date;
*/
@Data
public class StoryResult {
- @ApiModelProperty(value = "故事ID", example = "1")
+ @ApiModelProperty(value = "故事ID", required = true, example = "1")
private Long id;
- @ApiModelProperty(value = "故事名称", example = "海底小纵队")
+ @ApiModelProperty(value = "故事名称", required = true, example = "海底小纵队")
+ @Length(max = 20)
private String name;
@ApiModelProperty(value = "创建时间", example = "2019-04-14 19:02:12")
diff --git a/sop-gateway/pom.xml b/sop-gateway/pom.xml
index fb315931..2a3b5736 100644
--- a/sop-gateway/pom.xml
+++ b/sop-gateway/pom.xml
@@ -24,7 +24,7 @@
com.gitee.sop
sop-bridge-nacos
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-website/pom.xml b/sop-website/pom.xml
index f51225ce..26c466e6 100644
--- a/sop-website/pom.xml
+++ b/sop-website/pom.xml
@@ -25,7 +25,7 @@
com.gitee.sop
sop-bridge-nacos
- 4.0.2-SNAPSHOT
+ 4.0.3-SNAPSHOT
diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java
new file mode 100644
index 00000000..f158e4b5
--- /dev/null
+++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/BizCode.java
@@ -0,0 +1,13 @@
+package com.gitee.sop.websiteserver.bean;
+
+import lombok.Data;
+
+/**
+ * @author tanghc
+ */
+@Data
+public class BizCode {
+ private String code;
+ private String msg;
+ private String solution;
+}
diff --git a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java
index 5a6236b6..929d20ad 100644
--- a/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java
+++ b/sop-website/src/main/java/com/gitee/sop/websiteserver/bean/DocItem.java
@@ -30,6 +30,7 @@ public class DocItem {
List requestParameters;
List responseParameters;
+ List bizCodeList;
public String getNameVersion() {
return name + version;
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 95240efd..0f41da00 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
@@ -1,7 +1,9 @@
package com.gitee.sop.websiteserver.manager;
+import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.gitee.sop.websiteserver.bean.BizCode;
import com.gitee.sop.websiteserver.bean.DocInfo;
import com.gitee.sop.websiteserver.bean.DocItem;
import com.gitee.sop.websiteserver.bean.DocModule;
@@ -121,6 +123,10 @@ public class SwaggerDocParser implements DocParser {
docItem.setDescription(docInfo.getString("description"));
docItem.setMultiple(docInfo.getString("multiple") != null);
docItem.setProduces(docInfo.getJSONArray("produces").toJavaList(String.class));
+ String bizCodeStr = docInfo.getString("biz_code");
+ if (bizCodeStr != null) {
+ docItem.setBizCodeList(JSON.parseArray(bizCodeStr, BizCode.class));
+ }
docItem.setModuleOrder(NumberUtils.toInt(docInfo.getString("module_order"), 0));
docItem.setApiOrder(NumberUtils.toInt(docInfo.getString("api_order"), 0));
String moduleName = this.buildModuleName(docInfo, docRoot);
@@ -208,6 +214,8 @@ public class SwaggerDocParser implements DocParser {
protected List buildDocParameters(String ref, JSONObject docRoot, boolean doSubRef) {
JSONObject responseObject = docRoot.getJSONObject("definitions").getJSONObject(ref);
+ String className = responseObject.getString("title");
+ JSONObject extProperties = docRoot.getJSONObject(className);
JSONObject properties = responseObject.getJSONObject("properties");
List docParameterList = new ArrayList<>();
if (properties == null) {
@@ -224,10 +232,20 @@ public class SwaggerDocParser implements DocParser {
JSONObject fieldInfo = properties.getJSONObject(fieldName);
DocParameter docParameter = fieldInfo.toJavaObject(DocParameter.class);
docParameter.setName(fieldName);
+ if (extProperties != null) {
+ JSONObject prop = extProperties.getJSONObject(fieldName);
+ if (prop != null) {
+ String maxLength = prop.getString("maxLength");
+ docParameter.setMaxLength(maxLength == null ? "-" : maxLength);
+ String required = prop.getString("required");
+ if (required != null) {
+ docParameter.setRequired(Boolean.parseBoolean(required));
+ }
+ }
+ }
docParameterList.add(docParameter);
RefInfo refInfo = this.getRefInfo(fieldInfo);
if (refInfo != null && doSubRef) {
- // 如果是树状菜单的话,这里可能触发死循环
String subRef = refInfo.ref;
boolean nextDoRef = !Objects.equals(ref, subRef);
List refs = buildDocParameters(subRef, docRoot, nextDoRef);
diff --git a/sop-website/src/main/resources/public/pages/doc/doc.html b/sop-website/src/main/resources/public/pages/doc/doc.html
index 65d0b6d5..b89b55a7 100644
--- a/sop-website/src/main/resources/public/pages/doc/doc.html
+++ b/sop-website/src/main/resources/public/pages/doc/doc.html
@@ -367,6 +367,29 @@
+
+
+
+
+
+ 公共错误码
+
+
+
+
+
+ 错误码 |
+ 错误描述 |
+ 解决方案 |
+
+
+
+
+
+
+
diff --git a/sop-website/src/main/resources/public/pages/doc/docEvent.js b/sop-website/src/main/resources/public/pages/doc/docEvent.js
index 5f58b327..9f6c60d9 100644
--- a/sop-website/src/main/resources/public/pages/doc/docEvent.js
+++ b/sop-website/src/main/resources/public/pages/doc/docEvent.js
@@ -16,6 +16,7 @@ function selectItem(docItem, layui) {
createRequestParameter(docItem);
createResponseParameter(docItem);
createResponseCode(docItem);
+ buildBizCode(docItem);
var $li = $('#docItemTree').find('li[nameversion="'+nameVersion+'"]');
$li.addClass('layui-this').siblings().removeClass('layui-this');
@@ -124,3 +125,21 @@ function buildExample(parameter) {
return '\"' + parameter.example + '\"';
}
}
+
+function buildBizCode(docItem) {
+ var html = []
+ var bizCodeList = docItem.bizCodeList;
+ if (bizCodeList && bizCodeList.length > 0) {
+ for (var i = 0; i < bizCodeList.length; i++) {
+ var bizCode = bizCodeList[i];
+ html.push('')
+ html.push(''+bizCode.code+' | ')
+ html.push(''+bizCode.msg+' | ')
+ html.push(''+bizCode.solution+' | ')
+ html.push('
')
+ }
+ $('#bizCode').find('tbody').html(html.join(''));
+ } else {
+ $('#bizCode').find('tbody').html('暂无数据 |
');
+ }
+}
\ No newline at end of file