我在ASP.NET Core项目中使用AddSwaggerGen
。我编写了一个ISchemaFilter
来更改Swagger UI在其示例JSON中使用的属性值。我使用这种方法是因为过滤器示例化我的模型类型以获得属性的默认值。这部分工作,这里没有显示。
过滤器还将Nullable<T>
属性的示例值更改为null
。这适用于大多数类型,但不适用于枚举属性。
public class SwaggerPropertyValueFilter : ISchemaFilter
{
public void Apply(OpenApiSchema schema, SchemaFilterContext context)
{
if (context.Type.Namespace == "MyAPI.Services.Models" && context.Type.GetConstructor(Type.EmptyTypes) != null)
{
var schemaProps = schema.Properties.OrderBy(o => o.Key).Select(o => o.Value);
var modelProps = context.Type.GetProperties().OrderBy(o => o.Name);
var props = schemaProps.Zip(modelProps, (schema, model) => new { Schema = schema, Model = model } );
foreach(var prop in props)
{
var type = Nullable.GetUnderlyingType(prop.Model.PropertyType);
if (type != null)
{
prop.Schema.Example = new OpenApiNull();
continue;
}
}
}
}
}
我也试着设置OpenApiSchema.Enum
:
var type = Nullable.GetUnderlyingType(prop.Model.PropertyType);
if (type != null)
{
if (type.IsEnum)
{
prop.Schema.Enum = new List<IOpenApiAny>() { new OpenApiNull() };
}
prop.Schema.Example = new OpenApiNull();
continue;
}
我在调试器中逐步解决了这些条件。他们正在被处决。但是示例JSON仍然总是包含string
或int
值,用于可空枚举属性,这取决于我是否使用JsonStringEnumConverter
。
我注意到OpenApiSchema.Nullable
对于可空枚举属性是false,但是将其设置为true也没有任何区别。
1条答案
按热度按时间5uzkadbs1#
这是由于枚举在OpenAPI架构中被视为引用类型造成的。(顺便说一句,字符串不是。)有两种选择/解决方法:
SwaggerGenOptions.UseAllOfToExtendReferenceSchemas()
使Swagger UI允许引用类型属性上的元数据SwaggerGenOptions.UseInlineDefinitionsForEnums()
内联枚举属性第一个选项破坏了我的模式过滤器。过去有属性的架构转而引用另一个同样没有属性的架构。我不知道该怎么做。
第二个选择解决了我的问题。我不知道这会对客户产生什么影响。还好我还没写。