当前位置: 首页 > 知识库问答 >
问题:

向Swagger文档添加自定义ValidationAttribute

苍德寿
2023-03-14

我有一个自定义验证属性

假设我有一个实现ValidationAttory的HelloWorld类。然后我将此属性应用于我的API中的一个字段。

[HelloWorld]
public string FirstName { get; set; }

当我生成Swagger UI时,我得到一个JSON OpenAPI规范,模型显示每个字段的属性,如下所示:

如果我添加了一个必需的标记,如果我使用诸如RegularExpression/Range/StringLength之类的属性,则会显示一个星号,文本会指定这一点。然而,我想用我自己的描述让别人知道自定义验证。

有可能吗?

任何帮助都将不胜感激。我花了一整天的时间研究DocumentFilter/SchemaFilter/OperationFilter,但找不到任何好的文档或示例。

共有2个答案

曾嘉荣
2023-03-14

你可以这样做:

>

  • 创建自定义验证属性,例如UniqueAttribute

    public class UniqueAttribute : ValidationAttribute { ... }
    

    将此属性应用于模型特性

    [Unique]
    public string Name { get; set; }
    

    实现ISchemaFilter接口扩展

    public class AddUniquenessDescriptionFilter : ISchemaFilter
    {
      public void Apply(OpenApiSchema schema, SchemaFilterContext context)
      {
        var attr = context.MemberInfo?.CustomAttributes.Where(x => 
             x.AttributeType.Name == nameof(UniqueAttribute)) 
             .FirstOrDefault();
    
        if (attr is not null)
        {
          schema.Extensions.Add("isUnique", new OpenApiBoolean(true));
        }
      }
    }
    

    并在启动时使用扩展

    builder.Services.AddSwaggerGen(options => 
    { 
      options.SchemaFilter<AddUniquenessDescriptionFilter>(); 
    });
    

    结果如下:招摇文档

    下面是一个完整的示例:自定义ValidationAttribute

  • 何琨
    2023-03-14

    我试图使用OperationFilter,但上不支持它。Net Framework 4.1。

    我必须使用过滤器来修改文档(我相信这是使用was x扩展)

     类似资料:
    • 我正在从事一个包含如下代码的项目:如何将具有自定义ID的文档添加到firestore(Angular) 当我要尝试这个应用程序时,它总是崩溃。但是代码都是一样的。 我在LogCat中得到的错误是: 无效的文档引用。文档引用必须有偶数个段,但用户有1个 我的完整代码如下: 我希望“user\u id”是文档id,而不是Firestore生成的另一个id。 有人能帮忙吗?提前谢谢你。

    • 我正试图改变大摇大摆的基本路线。目前我有 当我从swagger发送请求时,请求将转到,但服务返回。 当我通过邮递员发送的请求时,它就可以工作了。 因此api注册为,swagger只是将基础添加到它的顶部,如果请求发送到swagger UI将无法工作 但问题是现在可以在上获得swagger文档,而不是。因为我们在上有所有其他服务文档,所以这是没有用的。 是否有任何方法可以添加基本文件,并且仍然可以访

    • 我有一些不应该实例化的带有自定义注释的类(抽象类,它只是实际bean的子组件)。但是在这些类之上,在运行时,在上下文初始化阶段,我想在应用程序上下文中添加额外的bean。 因此,基本上我需要扫描类路径,处理结果,并将新bean引入curent应用程序上下文。 似乎是spring-mvc、spring-tasks和spring-integration在做这件事(我试着从源代码中学习--没有运气) 我

    • 搜索很好,它在工作,我正在过滤的交易类型(出售或出租)和房间数量在每个房地产。 但是我的JSON响应缺少很多字段,包括ACF。例如:{ “id”:149,“post_author”:“2”,“post_date”:“2016-03-03 23:53:39”,“post_date_gmt”:“2016-03-03 23:53:39”,“post_content”:“”post_title“:”opo

    • 我想添加“from”(date)来响应datepicker输入,但到目前为止,我有一些奇怪的行为。 我的代码: 到目前为止,我试过: 和 但这两种解决方案都将我的日期从“2020年9月14日16:43”转变为“从周一9月14 2020 17:19:38格林尼治标准时间0400(留尼汪岛)”,这是不必要的行为,因为我绝对想要法语日期。任何想法?谢啦

    • 我有一个用java编写的Maven JAX RS项目,使用enuncicate在每次构建时自动生成文档。到目前为止,它运行良好——他为我的项目中的所有RESTendpoint生成api文档。 现在我也用有用的jdoc写了一些util类——但是这些类不是endpoint——所以,expertion不会包括它们。 有没有办法告诉enunicate,他应该用一些额外类的jdoc生成额外的文档?我认为应该