Warm tip: This article is reproduced from serverfault.com, please click

java-如何在Swagger中将OptionalInt参数作为整数处理?

(java - How to handle OptionalInt parameters as integers in Swagger?)

发布于 2020-12-02 09:23:34

我正在尝试为现有的Jersey项目获取OpenAPI定义。

我有很多采用OptionalInt参数的方法,例如:

public Response listAgents(@Auth AuthenticatedUser auth,
            @QueryParam("count") OptionalInt count, @QueryParam("start") OptionalInt start)

Swagger将这些参数检测为对象(这是错误的):

      parameters:
      - name: count
        in: query
        schema:
          type: object
          properties:
            empty:
              type: boolean
            present:
              type: boolean
            asInt:
              type: integer
              format: int32

有没有一种方法可以将Swagger配置为将OptionalInt类型处理为Integer类型,从而用重写@Parameter(schema = @Schema(implementation = Integer.class))每个参数的方法重写每个方法

Questioner
Bastien Durel
Viewed
11
Bastien Durel 2020-12-03 17:15:04

我找到了解决方案:

在配置文件中,我放置了一个模型转换器

modelConverterClasses: 
- fr.data.openapi.WaPropertyConverter

在其中定义了架构以处理OptionalInt参数:

import io.swagger.v3.core.converter.ModelConverter;

public class WaPropertyConverter implements ModelConverter {
    @Override
    public Schema<?> resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
        if (type.getType() instanceof SimpleType) {
            SimpleType type_ = (SimpleType) type.getType();
            if (type_.isTypeOrSubTypeOf(OptionalInt.class))
                return optionalIntSchema();

        }
        if (chain.hasNext()) {
            return chain.next().resolve(type, context, chain);
        } else {
            return null;
        }
    }

    protected Schema<?> optionalIntSchema() {
        Schema<Integer> s = new Schema<Integer>();
        s.setType("integer");
        s.format("int32");
        return s;
    }
}

这样我就为我所有的OptionalInt都获得了正确的模式

      - name: count
        in: query
        schema:
          type: integer
          format: int32