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

使用构造函数在 swagger 中设置属性

梅逸清
2023-03-14

我正在构建一个API并使用swagger测试endpoint。我有一个产品:

public string ProductName { get; set; }
.
.
.
public Price Price { get; set; }

在这个DTO中,我想使用在我的代码中使用的Price类。价格类如下所示:

public class Price
{
    public Price(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public decimal Amount { get; private set; }
    public string Currency { get; private set; }
}

但是由于私有设置器在Price类中使用,我无法使用swagger设置这些值(它在这些上具有readonly属性)。我真的很喜欢这种拥有私有设置器并使用构造函数设置值的方法,顺便说一句,这是公共的。有没有办法我可以使用swagger为Price类设置值,并且仍然在属性上使用私有设置器?

共有2个答案

柯曦
2023-03-14

添加此架构筛选器对我有效。

public class AddReadOnlyPropertiesFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema?.Properties?.Count > 0)
            schema.Properties.Values.SingleOrDefault(v => v.ReadOnly = false);
    }
}
南门飞
2023-03-14

更新:我最初的回答(见下文)是这是不可能的,但是,这实际上取决于您项目中使用的序列化库。

例如,Newtonsoft的 Json.NET 允许您通过构造函数设置一些类的属性(注意:如果您的类带有多个构造函数,请应用JsonConuctorAttribute):

public class Price
{
    [JsonConstructor]
    public Price(decimal amount, string currency)
    {
        Amount = amount;
        Currency = currency;
    }

    public decimal Amount { get; private set; }
    public string Currency { get; private set; }
}

原答案

不,这是不可能的。因为如果您将属性保持私有,并仅通过构造函数初始化它们,反序列化器将不知道这些属性应如何映射到后端(DTO)模型。

因此,在使用DTO时,通常不会看到人们通过构造函数初始化。

此外,由于您在整个代码中都使用了Price类,因此您将“域模型”与“视图模型”(=用于与客户端通信的模型)混合使用,这是一种务实的方法,但在DDD等样式中并不提倡。在这种情况下,如果您希望在属性上使用不同的属性或不同的访问修饰符,您应该创建一个专用的PriceDTO,它映射到您的价格实体,但具有公共setter和getter。

另一种选择是将向客户端发送数据(通过GET)的endpoint使用的模型与接收数据作为有效负载以创建或更新事物(通过POST/PATCH/PUT)的endpoint使用的模型分开。然而,这通常是以冗余为代价的,因为这两种情况下的模型通常非常相似。

 类似资料:
  • 我想做一个简单的POJO(POKO?)在Kotlin中使用一个默认的空构造函数和一个带有参数的辅助构造函数创建一个类,该类提供属性 这并没有给我和属性: 这为我提供了属性,但它们在实例化后没有设置: 这给了我一个编译错误,说“不允许在二级构造函数参数上使用'var'”: 那么,这是怎么做到的?我如何拥有一个默认构造函数和一个带有参数和属性的二级构造函数?

  • 我正在尝试从我的主方法创建一个Spring bean。 我已将此bean配置为具有特定属性。这些值是在由@Configuration注释的SpringConfig类中指定的。 bean是使用Spring Application Context在我的main()方法中创建的。bean成功启动,但它没有我在SpringConfig类中指定的属性。我不明白为什么? 我可能已经确定了问题的原因:这个bea

  • 1.如何通过参数化构造函数设置这些属性?? 类文件 > 我想通过传递参数构造函数的setter设置这些属性,但它没有设置这些属性 在这里,我想通过toString方法显示属性 }对象文件 为什么我无法通过构造函数设置这些属性?? public class Runnable{public static void main(String[]args){Product p1=新产品(“pc”,“Grey

  • 我们正在构建一个与远程API通信的webapp。我想这样设计这个远程API的客户端: 关键是,我想在构建期间将凭据传递给这个客户端,并让所有其他方法使用这些凭据。我的第二个要求是我希望这个实例在会话中。 我在这里发现了如何传递动态构造函数参数。 我在这里发现了如何创建会话属性。 但我想不出一种方法来结合这两种技术。据我所知,您必须在自己的类getter方法中实例化会话属性。这种类似getter的方

  • 问题内容: 到目前为止,我已经看到了两种在Java中设置变量值的方法。有时使用带有参数的构造函数,而其他setter方法则用于设置每个变量的值。 我知道,一旦使用“新”关键字实例化了一个类,构造函数就会在类内部初始化一个实例变量。 但是,什么时候使用构造函数,何时使用setter? 问题答案: 当您要创建对象的新实例时,应使用构造函数方法,该实例的值已填充(准备使用的对象中已填充值)。这样,您无需

  • 以下作品 而这不是(未解决的引用:tabCount) 我是Kotlin的新手,只是不明白为什么不能在类本身中使用val属性。有人能解释一下吗?谢谢