首页 > 解决方案 > Swagger 结构错误“不应具有其他属性”$ ref 数组中的元素

问题描述

由于. $ref_type: array

https://editor.swagger.io中替换$ref: '#/definitions/EnumExample1'type: array. 我没有看到错误。但我不确定如何在 swagger-gen 代码中解决这个问题。

如果需要更多信息来理解这个问题,请在评论中发表!

大摇大摆的片段

  parameters:
    - in: query
      name: parameterNameX
      description: parameterNameX
      type: string
    - in: query
      name: name
      type: string
    - in: query
      name: include
      description: Comma-separated list of properties to include in the response
      type: array
      items:
        $ref: '#/definitions/EnumExample1'

错误

Structural error at paths./v1/workflows.get.parameters.2.items
should NOT have additional properties
additionalProperty: $ref
Jump to line 30

启动.cs

 services
                .AddMvc(options =>
                {
                    options.EnableEndpointRouting = false;
                    options.Conventions.Add(new CsvQueryStringConvention());
                })
                .AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
                    options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
                    //ensure enums passed to client are strings
                    options.SerializerSettings.Converters.Add(new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy()});
                })

 services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("",
                    new OpenApiInfo()
                    {
                        Title = "Service",
                        Version = "v1"
                    });

app.UseSwagger(c =>
            {
                c.RouteTemplate = "app/swagger/{documentName}/swagger.json";
                c.PreSerializeFilters.Add((openApiDocument, httpReq) =>
                {
                    openApiDocument.Servers = new List<OpenApiServer>
                    {
                        new OpenApiServer { Url = $"https://{httpReq.Host.Value}" }
#if DEBUG
                        , new OpenApiServer { Url = $"http://{httpReq.Host.Value}" }
#endif
                    };
                });
                c.SerializeAsV2 = true;
            });

模型

public EnumExample1[] Example { get; set; }

来自 Swagger 的示例将作为逗号分隔的字符串传递。由于 c.SerializeAsV2 = true; 我不确定为什么生成的 Swagger.json 具有 OpenApi3 标准的 $ref 元素。

标签: swaggerswagger-2.0asp.net-core-3.1swagger-editorswashbuckle.aspnetcore

解决方案


将 UseInlineDefinitionsForEnums 添加到 swagger-gen 删除了对定义的引用并添加了类型:字符串。

在 swagger 和 openapi 上发现了一些未解决的问题,

OpenAPI.NET:SerializeAsV2产生无效的招摇(当 SerializeAsV3 有效时) [打开]

Swashbuckle.AspNetCore:查询参数中没有枚举类型(使用 SerializeAsV2)(使用 UseInlineDefinitionsForEnums 解决方案关闭)

services.AddSwaggerGen(c =>
            {
                
                c.SwaggerDoc(....);
                
                //Generate inline schema definitions (as opposed to referencing a shared definition) for enum parameters and properties
                c.UseInlineDefinitionsForEnums();

推荐阅读