【问题标题】:How to set a default custom schema for types in Swagger如何为 Swagger 中的类型设置默认自定义架构
【发布时间】:2022-10-06 05:57:19
【问题描述】:

有一种方法可以将自定义模式定义为 Swagger 中 Java 类的默认模式?

您可以使用如下注释设置架构:

schema = @Schema(type = \"string\", format = \"<custom-format>\", example = \"<custom-example>\"))

但是我想将此模式默认分配给 Java 类,所以我不需要添加模式注释总是我在 API 上定义这个数据类型。


更新

默认模式类型在https://github.com/swagger-api/swagger-core/blob/master/modules/swagger-core/src/main/java/io/swagger/v3/core/util/PrimitiveType.java 中定义

有办法覆盖或扩展它吗?

    标签: java rest swagger


    【解决方案1】:
    1. 创建自定义模型转换器:
      import java.lang.reflect.Type;
      import java.time.YearMonth;
      import java.util.Iterator;
      
      import com.fasterxml.jackson.databind.type.SimpleType;
      
      import io.swagger.v3.core.converter.AnnotatedType;
      import io.swagger.v3.core.converter.ModelConverter;
      import io.swagger.v3.core.converter.ModelConverterContext;
      import io.swagger.v3.oas.models.media.Schema;
      
      /*
      * Custom ModelConverter that create a custom schema for YearMonth types
      */
      public class CustomModelConverter implements ModelConverter {
          private static final Schema SCHEMA_YEAR_MONTH = new Schema().type("string").format("year-month").example("2020-06");
      
          @Override
          public Schema resolve(AnnotatedType annotatedType, ModelConverterContext context, Iterator<ModelConverter> chain) {
              Type type = annotatedType.getType();
              if (type instanceof SimpleType) {
                  SimpleType simpleType = (SimpleType) type;
      
                  if (simpleType.getRawClass().isAssignableFrom(YearMonth.class)) {
                      return SCHEMA_YEAR_MONTH;
                  }
              }
      
              // It's needed to follow chain for unresolved types
              if (chain.hasNext()) {
                  return chain.next().resolve(annotatedType, context, chain);
              }
              return null;
          }
      }
      
      1. 注册您的自定义 ModelConverter:
      ModelConverters.getInstance().addConverter(new CustomModelConverter());
      

      建议:将其作为静态初始化块放在 JAX-RS Activator 上

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      相关资源
      最近更新 更多