【问题标题】:Duplicate Swagger discriminator field in rest response休息响应中重复的 Swagger 鉴别器字段
【发布时间】:2019-08-23 06:06:10
【问题描述】:

在 Rest 响应中,我的 swagger 文件中标记为“鉴别器”的字段被复制。我有一个父对象,它有一个名为“subjectType”的字段,我已将其标记为鉴别器。在我的休息调用中,我只返回资源对象(SubjectA 对象或 SubjectB 对象基于请求中的 subjectType),它具有以下 swagger 文件中提到的所有参数:

Subject:

type: object
discriminator: subjectType
properties:

  id:
    type: string
    minLength: 32
    maxLength: 32

  description:
    type: string
    maxLength: 350

  subjectType:
    type: string
    enum:
      - SubjectA
      - SubjectB

required:
  - subjectType
  - description

SubjectA:

allOf:

  - $ref: "#/definitions/Subject"
  - type: object
    properties:
      name:
        type: string
        maxLength: 100

      complexity:
        type: string
        maxLength: 256

    required:
    - name
    - complexity

SubjectB:

allOf:
  - $ref: "#/definitions/Subject"
  - type: object
    properties:
      prof:
        type: string
        maxLength: 100

      ref:
        type: string
        maxLength: 256

    required:
    - prof
    - ref

所以,当我返回 SubjectASubjectB 类型的响应对象时,我发回的响应对象只有一个“subjectType”字段,但实际的 json返回给客户端的响应有两个“subjectType”字段,我认为这是招摇的。 Swagger 版本:2.4.1

回复如下:

{ "subjectType" : "SubjectA", “id”:“123”, "subjectType" : "SubjectA", “名称”:“abc”, “复杂性”:“L1” }

@Path("/subjects")
@POST
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@ResponseStatus(status = Response.Status.CREATED)
public Response createSubject(Subject subject) {

        //Removed my DAO calls and other logic.

        final Subject subject =
                createSubject(profile); //Modifying the subject object in this method as per my needs.
        return Response.status(Response.Status.CREATED).entity(subject).build();


}

以下是swagger codegen生成的对象:

@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2019-04-01T17:05:27.110-07:00")@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "subjectType", visible = true )
@JsonSubTypes({
@JsonSubTypes.Type(value = SubjectA.class, name = "SubjectA"),
@JsonSubTypes.Type(value = SubjectB.class, name = "SubjectB"),
})

public class Subject {

@JsonProperty("id")
private String id;

@JsonProperty("description")
private String description;

@JsonProperty("subjectType")
private String subjectType;

//Getters and Setters

}


@javax.annotation.Generated(value = "io.swagger.codegen.languages.JavaClientCodegen", date = "2019-04-01T17:05:27.110-07:00")
public class SubjectA extends Subject {

@JsonProperty("name")
private String name;

@JsonProperty("complexity")
private String complexity;

//Getter and Setters


}

如何阻止 subjectType 字段在发送回客户端的 Json 响应中填充两次?

【问题讨论】:

标签: java rest jax-rs yaml swagger


【解决方案1】:

除了所涉及的开销之外,我不完全确定您的担忧是什么,在响应 JSON 中有重复的键。

JSON RFC,表示 JSON 对象:

对象中的名称应该是唯一的。

其中的应该是正式的defined as

这个词或形容词“推荐”的意思是 在特定情况下可能存在忽略 特定项目,但必须了解全部含义并 在选择不同的课程之前仔细权衡。

现在可能没有理由发生这种重复,但它并不被禁止,因此所有确认 JSON 工具都需要能够处理它。我本来希望 JSON 规范说明在存在非唯一键(例如第一个或最后一个值)的情况下选择什么值,但由于这些键的值是相同的,这并不重要。

这仍然是如何发生的问题。在许多语言中,JSON 对象的内部表示(例如 Python 中的 dict)是基于哈希的映射,甚至不能有重复的键。我假设这个 JSON 是以某种方式即时生成的,没有完整的内部表示,这会过滤掉重复项。

【讨论】:

  • 虽然这个答案有有用的信息,但它并没有真正解决似乎是“如何更改我的代码/配置我的服务器以不产生重复的 JSON 字段”的问题。
  • @Helen OP的帖子中有两个疑问句,都在帖子的末尾(以“?”结尾的句子)。你没读那么远吗?我通过使其无效来明确解决第二个问题,因为显然没有必要担心。如果没有疑问句,我会第二次猜测 OP 想问“我可以使用 swagger 的替代方法,它不会生成带有重复键的 JSON”,您的“如何更改我的代码”是完全荒谬,因为 OP 帖子中只有 YAML 文档,没有可以更改的代码。
  • @Anthon 我已将代码 sn-ps 附加到我的原始问题中。我从控制器发回的响应只有一个 subjectType 字段,因为我只返回了只有一个 subjectType 字段的 subject 对象。但是返回给客户端的 json 响应有两个 subjectType 字段。我的控制器无法返回重复字段,因为它在 Subject 对象中只有一个 subjectType 字段。我还调试了我的代码,发现只返回了一个 subjectType 字段。我无法理解这个字段是如何在 json 响应中重复的。
  • @AlfaRomeo 欢迎来到Stack Overflow。您不应该在此站点上做一些事情,其中​​之一就是即时更改问题。我在你原来的帖子中解决了这个问题,但现在你改变了问题,所以我的回答只有在有人回顾你问题的历史时才有意义。你永远不应该改变这样的问题,最好发布一个新的问题来引用这个问题:“在我的问题中,我了解到 JSON 文件中的双键并不重要,但我现在仍然想知道如何防止这种情况发生. 这是我的代码....”。您不应该在帖子中添加“欣赏......”。
  • @AlfaRomeo 进一步澄清:如果您的原始帖子还没有答案,然后您意识到原始问题不会给您想要的答案(因为您重新阅读了疑问句,或者因为您的帖子下的 cmets 等),那么您当然可以更改您的帖子以澄清您的需求。但是您应该始终注意,在原始帖子中的问题得到回答后,您不会创建移动目标。
猜你喜欢
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2018-12-21
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2017-03-21
相关资源
最近更新 更多