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

使Swashbuckle将引用类型属性描述为可为Null,或使NSwag将客户端修饰为默认值,而不是不允许为Null

李奕
2023-03-14

我有一个看起来像这样的DTO:

public class OrderDto{
  public CustomerDto Customer{get;set;}
  public ProductDto[] Products{get;set;}
}

当Swashuckle在OpenAPI 3规范中描述它时,这两个属性都不会出现在必需列表中,并且客户属性没有标记任何nullable,但产品属性标记为nullable: true

"OrderDto": {
    "type": "object",
    "properties": {
      "customer": {
        "$ref": "#/components/schemas/CustomerDto"
      },
      "products": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/ProductDto"
        },
        "nullable": true
      }
    },
    "additionalProperties": false
  },

在客户端,如果我没有将客户设置为服务器端的某个内容,则会出现deser错误:

Newtonsoft. Json. JsonSerializationException:'必需属性'客户'期望一个非空值

来自服务器的JSON(顺便提一下,由System.Text.JSON提供服务,而不是Newtonsoft)如下所示:

{"customer":null,"products":[]}

NSwag用完整的存根类修饰客户端类,如下所示:

[System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "10.5.2.0 (Newtonsoft.Json v11.0.0.0)")]
public partial class OrderDto
{    
    [Newtonsoft.Json.JsonProperty("customer", Required = Newtonsoft.Json.Required.DisallowNull, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
    public CustomerDto Customer { get; set; }

    [Newtonsoft.Json.JsonProperty("products", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)]
    public System.Collections.Generic.ICollection<ProductDto> Products { get; set; }
}

我现在正试图找出我需要改变什么,以及从哪里获得更宽容的行为:

最终,我希望能够不将客户端设置为服务器端的任何内容,将其发送给客户端,无论它是否为null或完全从JSON中丢失:

{
  customer: null,
  products: [ ... ]
}

{
  products: [ ... ]
}

我希望客户端(也是一个C#应用程序)对此进行验证,并给我一个Customer属性为null的对象(默认值)

根据所需的行为,哪个工具的行为正确?

我是否应该改变Swashback如何生成OA3规范(以及它是如何实现的?),或者我应该改变NSwag解释生成规范的方式吗?

共有1个答案

郎睿
2023-03-14

我在启动配置中应用了这一点:

services.AddSwaggerGen(c =>
{
    ...
    c.UseAllOfToExtendReferenceSchemas();

这似乎有点生硬,但它使所有内容都可以为null,从而将参考类型的NSwag的“Required”生成从“DisallowFull”更改为“Default”

 类似资料:
  • 使用斜扣。ASP中的AspNetCore。NET Core webapp,我们有如下响应类型: 使用Swashback发出swagger API JSON时,这将变成: 这里的问题是,DateTime是一种值类型,不能为null;但是发出的Swagger API JSON没有将这两个属性标记为必需的。这种行为对于所有其他值类型都是一样的:int、long、byte等,它们都被认为是可选的。 为了完

  • 所以这是我以前在jooq 3.11中工作的查询。 我正在更新一个JSON字段,但是它使用Json绑定映射到我模型中的字符串,我将在下面发布 这在升级到jooq 3.13.2后不再有效。我还不得不将我的sql方言更改为mysql,即使我正在使用mysql 5_7数据库,这可能是问题所在? 我也试过这个,它还是一样的 JsonBinding.class JsonConverter.class 以下是j

  • 我是MySQL的博士后新手。 我创建了一个表,其列“col”的默认值为null。 但是,在默认列中,没有任何内容表明它是空字段。 在模式输出中,默认值应该显示为null吗? 我也尝试了上面的相同示例,但使用了。键入时,Default列中没有显示任何内容。在该示例中,我插入一行,它获取默认值,因此我知道正在使用默认值(至少对于整数值)。更新:默认列实际上显示了99。我使用了自动完成\d并查看了错误的

  • 我试图执行我的保存endpoint到邮递员,我收到这个错误: 原因:org.h2.jdbc.JdbcBatchUpdateException: NULL不允许列CREATION_DATE;SQL语句:插入到客户(authentication_uid、creation_date、customer_uid、default_payment_method_uid、guid、last_edit_date、p

  • 我的application.properties(读取环境变量) MyService类: 给它赋值并不能解决问题。例如,用 null 对于我所读的内容,我需要一个委托的(https://kotlinlang.org/docs/reference/delegated-properties.html),但我不能完全理解它。另外,如果有一个“更干净”的解决方案,我不想编写另一个方法来设置属性。有什么想法

  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?