如何在Swagger中为类型设置默认自定义架构

zbdgwd5y  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(229)

在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中定义
有办法覆盖或扩展它吗?

wvmv3b1j

wvmv3b1j1#

1.创建自定义ModelConverter:

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激活器上的静态初始化程序块

相关问题