Java 静止响应中的重复摆动鉴别器字段

Java 静止响应中的重复摆动鉴别器字段,java,rest,jax-rs,yaml,swagger,Java,Rest,Jax Rs,Yaml,Swagger,在Rest响应中,在我的swagger文件中标记为“discriminator”的字段被复制。我有一个父对象,它有一个名为“subjectType”的字段,我已将该字段标记为鉴别器。在我的rest调用中,我只返回资源对象(基于请求中的subjectType的SubjectA对象或SubjectB对象),该对象具有以下swagger文件中提到的所有参数: Subject: type: object discriminator: subjectType properties: id:

在Rest响应中,在我的swagger文件中标记为“discriminator”的字段被复制。我有一个父对象,它有一个名为“subjectType”的字段,我已将该字段标记为鉴别器。在我的rest调用中,我只返回资源对象(基于请求中的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
因此,当我返回类型为SubjectASubjectB的响应对象时,我返回的响应对象只有一个“subjectType”字段,但返回给客户机的实际json响应有两个“subjectType”字段,我认为swagger正在这样做。 招摇过市版本:2.4.1

以下是回应:

{ “主题类型”:“主题”, “id”:“123”, “主题类型”:“主题”, “名称”:“abc”, “复杂性”:“L1” }

以下是由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响应中填充两次?

除了涉及的开销外,我不完全确定您关心的是什么,repsonse Json中存在重复的键

其中,关于JSON对象:

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

在这里面的应该是正式的

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

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


这仍然留下了一个问题,这是如何发生的。在许多语言中,JSON对象的内部表示(例如Python中的dict)是基于散列的映射,甚至没有重复的键。我假设这个JSON是以某种方式动态生成的,没有完整的内部表示,这将过滤掉重复的内容。

除了涉及的开销之外,我不完全确定您关心的是什么,repsonse JSON中有重复的键

其中,关于JSON对象:

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

在这里面的应该是正式的

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

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


这仍然留下了一个问题,这是如何发生的。在许多语言中,JSON对象的内部表示(例如Python中的dict)是基于散列的映射,甚至没有重复的键。我假设这个JSON是以某种方式动态生成的,没有完整的内部表示,这将过滤掉重复项。

1)您有
discriminator:type
,但主题模式中没有
type
属性。它应该是
鉴别器:subjectType
?2) 您在服务器端使用什么库/框架来生成响应?你能发布发送有问题响应的端点的代码吗?@Helen 1。你们说得对,鉴别器是subjectType(它是一个打字错误,我现在编辑了我的问题)。2.我们使用Jersey(Jax-rs实现)。我现在已经将代码片段添加到我的问题中。请检查上面。看看这是否有帮助:,谢谢海伦,这篇文章对我有用。我已将@JsonTypeInfo注释更改为JsonTypeInfo.As.EXISTING_属性,而不是JsonTypeInfo.As.PROPERTY。@AlfaRomeo您是否使用生成的类,并在新生成后每次更改它?1)您有
鉴别器:type
但主题架构中没有
type
属性。它应该是
鉴别器:subjectType
?2) 您在服务器端使用什么库/框架来生成响应?你能发布发送有问题响应的端点的代码吗?@Helen 1。你们说得对,鉴别器是subjectType(它是一个打字错误,我现在编辑了我的问题)。2.我们使用Jersey(Jax-rs实现)。我现在已经将代码片段添加到我的问题中。请检查上面。看看这是否有帮助:,谢谢海伦,这篇文章对我有用。我已经将@JsonTypeInfo注释更改为JsonTypeInfo.As.EXISTING_属性,而不是JsonTypeInfo.As.PROPERTY。@AlfaRomeo您是否使用生成的类,并在新生成后每次都对其进行更改?虽然此答案包含有用的信息,但它并没有真正解决看起来很重要的问题“如何更改我的代码/配置我的服务器以不产生重复的JSON字段”。@Helen在OP的帖子中有两个疑问句,都在帖子的末尾(以“?”结尾的句子).你没有读到那么远吗?我明确地通过使第二个问题无效来解决第二个问题,因为担心显然是没有必要的。如果没有疑问句,我会猜测OP想问的问题是“有没有其他选择?”
@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


}