Skip to content

介绍

MESH-PLATFORM 是一个全新的软件开发框架。

1:项目使用框架

  • Knife4j: knife4j 自4.0版本开始,Knife4j提供对OpenAPI3规范的适配,底层规范解析框架依赖springdoc-openapi项目

2:配置

  • 1:Gateway网关配置
json
knife4j:
  gateway:
    # ① 第一个配置,开启gateway聚合组件
    enabled: true
    # ② 第二行配置,设置聚合模式采用discover服务发现的模式
    strategy: discover
    discover:
      # ③ 第三行配置,开启discover模式
      enabled: true
      # ④ 第四行配置,聚合子服务全部为Swagger2规范的文档
      version: openapi3
  • 2:模块配置
json
springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
    show-extensions: true
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: 'default'
      paths-to-match: '//**' #需要配置单/,文档//是为了消除转义
      packages-to-scan: com.platform
knife4j:
  enable: false
  setting:
    language: zh_cn

3:自定义枚举解析

  • 设计原由 @Schema注解可以将常见类型在Swagger文档描述中解析,但是一些装填标识类字段后端逐个补充填写耗时耗力,并且状态增删维护麻烦。所以需要自定义一个可以解析枚举描述,自动填充Swagger文档描述的注解来实现功能。

  • 1:自定义SchemaEnum注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValidator.class)
public @interface SchemaEnum {

    /**
     * 枚举类说明
     */
    String description() default SymbolConst.BLANK;
    /**
     * 枚举类对象
     */
    Class<? extends BaseEnum<? extends Enum<?>,? extends Serializable>> value();
    /**
     * 默认值
     */
    String defaultValue() default SymbolConst.BLANK;
    /**
     * 是否隐藏
     */
    boolean hidden() default false;
    /**
     * 是否必须
     */
    boolean required() default false;
    /**
     * 数据类型
     */
    String dataType() default SymbolConst.BLANK;

    /**
     * 缺少报错:XXX contains Constraint annotation, but does not contain a message parameter
     */
    String message() default SymbolConst.BLANK;

    /**
     * 缺少报错:XXX contains Constraint annotation, but does not contain a groups parameter
     */
    Class<?>[] groups() default {};

    /**
     * 缺少报错:XXX contains Constraint annotation, but does not contain a payload parameter
     */
    Class<? extends Payload>[] payload() default {};

}
  • 2:文档解析填充
@Component
public class SchemaPropertyExtend implements PropertyCustomizer {

    @Override
    public Schema customize(Schema schema, AnnotatedType type) {
        if (ObjectUtil.isEmpty(type.getCtxAnnotations())) {
            return schema;
        }
        //初始化描述
        StringBuilder description = new StringBuilder();
        //设置注解信息
        for (Annotation ctxAnnotation : type.getCtxAnnotations()) {
            if (ctxAnnotation.annotationType().equals(SchemaEnum.class)) {
                //设置必填项
                if(((SchemaEnum) ctxAnnotation).required()){
                    schema.setRequired(CollUtil.newArrayList(Boolean.TRUE.toString()));
                }
                //设置描述信息
                description.append(((SchemaEnum) ctxAnnotation).description());
                Class<? extends BaseEnum> clazz = ((SchemaEnum) ctxAnnotation).value();
                description.append(FormatUtil.getEnumDescJSON(clazz));
            }
        }
        //返回描述
        if (StrUtil.isNotEmpty(description)) {
            schema.setDescription(description.toString());
        }
        return schema;
    }

}
  • 3:使用枚举
    /**
     * 表单类型
     */
    @SchemaEnum(value = FormTypeEnum.class,description = "表单类型")
    private Integer formType;
  • 4:效果

alt text

郑州蝉鸣数字科技有限公司出品