休息响应中的重复Swagger鉴别符字段

时间:2019-04-02 01:57:01

标签: java rest jax-rs yaml swagger

在Rest响应中,我的swagger文件中标记为“ discriminator”的字段已重复。我有一个父对象,该对象具有一个称为“ subjectType”的字段,我已将其标记为鉴别符。在我的休息电话中,我只返回了资源对象(基于请求中的subjectType的 SubjectA 对象或 SubjectB 对象),该对象具有以下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

因此,当我返回 SubjectA SubjectB 类型的响应对象时,我发回的响应对象只有一个“ subjectType”字段,但实际是json返回给客户端的响应具有两个“ subjectType”字段,我认为这是大张旗鼓的。 Swagger版本:2.4.1

以下是回复:

{   “ subjectType”:“ SubjectA” ,   “ id”:“ 123”,   “ subjectType”:“ SubjectA” ,   “ name”:“ abc”,   “ complexity”:“ 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();


}

这是由摇摇欲坠的代码生成的对象:

@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


}

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

1 个答案:

答案 0 :(得分:-1)

除了所涉及的开销之外,我还不确定您在担心什么,在响应JSON中有重复的密钥。

JSON RFC说到JSON对象:

  

对象中的名称应唯一。

其中的应该正式defined

  

此字词或形容词“推荐”的意思是      在特定情况下可能存在正当理由而忽略      特定项目,但必须理解全部含义并      在选择其他路线之前,请仔细权衡。

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

这仍然留下了问题,这是如何发生的。在许多语言中,JSON对象的内部表示形式(例如Python中的$request->hasFile('shop1_quatation'))是基于哈希的映射,甚至不能具有重复的键。我假设此JSON是通过某种方式即时生成的,而没有完整的内部表示形式,这会过滤掉重复项。