.NET swagger省略了示例值中属性

jmp7cifd  于 2022-11-06  发布在  .NET
关注(0)|答案(2)|浏览(126)

是否有方法从示例值中排除/删除属性?

我使用c.IncludeXmlComments在我的模型上使用XML注解来提供swagger页面上的信息我使用///<example>Example Value</example> *XML标记 * 来设置示例值。我的请求模型并不要求默认设置所有字段,但是如果我不设置示例 *XML标记 *,示例值将被转换为它的类型。

{
  "ID": "string",
  "ExampleSetValue": "Example Value"
}

我希望示例值只包含ExampleSetValue属性,因此示例值如下所示

{
  "ExampleSetValue": "Example Value"
}

这是我创业时的昂首阔步的设置

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", openApiInfo);
    c.AddSecurityDefinition("Bearer", openApiSecurityScheme);
    c.AddSecurityRequirement(openApiSecurityRequirement);

    // Set the comments path for the Swagger JSON and UI.
    var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);

    c.IncludeXmlComments(xmlPath);
});

我的请求模型

public class CreateRequest
{
        /// <summary>
        /// ID of the user if available
        /// </summary>
        public string ID { get; set; }
        /// <summary>
        /// ExampleSetValue
        /// </summary>
        /// <example>Example Value</example>
        public string ExampleSetValue { get; set; }
    }
js4nwp54

js4nwp541#

Xml注解似乎不能用于排除属性。
如果你想忽略这个属性,我建议你使用[System.Text.Json.Serialization.JsonIgnore]属性,但是这样的话,当你序列化或者反序列化数据的时候,你的属性也会隐藏起来。

public class CreateRequest
{
    /// <summary>
    /// ID of the user if available
    /// </summary>
    [JsonIgnore]                   //add this..........
    public string ID { get; set; }
    /// <summary>
    /// ExampleSetValue
    /// </summary>
    /// <example>Example Value</example>
    public string ExampleSetValue { get; set; }
}

如果您只想从示例值中排除属性,则需要自定义ISchemaFilter:
产品型号:

public class CreateRequest
{
    /// <summary>
    /// ID of the user if available
    /// </summary>
    [IgnoreDataMember]               //add this..........
    public string ID { get; set; }
    /// <summary>
    /// ExampleSetValue
    /// </summary>
    /// <example>Example Value</example>
    public string ExampleSetValue { get; set; }
}

自定义ISchemaFilter:

public class MySwaggerSchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema?.Properties == null)
        {
            return;
        }
        var ignoreDataMemberProperties = context.Type.GetProperties()
            .Where(t => t.GetCustomAttribute<IgnoreDataMemberAttribute>() != null);

        foreach (var ignoreDataMemberProperty in ignoreDataMemberProperties)
        {
            var propertyToHide = schema.Properties.Keys
                .SingleOrDefault(x => x.ToLower() == ignoreDataMemberProperty.Name.ToLower());

            if (propertyToHide != null)
            {
                schema.Properties.Remove(propertyToHide);
            }
        }
    }
}

注册过滤器:

services.AddSwaggerGen(c =>
{
    //......
    c.SchemaFilter<MySwaggerSchemaFilter>();
});
3bygqnnd

3bygqnnd2#

我发现了一种完全符合我的情况的不同方法。您可以在您的模式上设置一个OpenApiObject类型的示例对象。
我创建了一个Document过滤器,它在我的swagger模式上循环。

public class AddExamplesFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        foreach (var schema in context.SchemaRepository.Schemas)
        {
            schema.Value.Example = ExampleManager.GetExample(schema.Key);
        }
    }
}

创建了ExampleManager类,该类根据模式名称返回我想要的示例对象。

public static OpenApiObject GetExample(string requestModelName)
{
    return requestModelName switch
    {
        "ObjectExample" => ObjectExample.GetExample(),
        _ =>  null
    };
}

作为最后一步,创建了一个示例类,它完全符合我希望我的示例看起来的样子。

public static class ObjectExample
{
    public static OpenApiObject GetExample()
    {
        return new OpenApiObject
        {
            ["ObjectInsideObject"] = new OpenApiObject
            {
                ["Name"] = new OpenApiString("name"),
            },
            ["ArrayWithObjects"] = new OpenApiArray
            {
                new OpenApiObject
                {
                    ["Object"] = new OpenApiObject
                    {
                        ["integer"] = new OpenApiInteger(15),
                    },
                    ["Description"] = new OpenApiString("description")
                }
            },
            ["date"] = new OpenApiDate(new DateTime().AddMonths(1)),
            ["Description"] = new OpenApiString("description"),
        };
    }
}

最终外观见Swagger页面

相关问题