Java 静止响应中的重复摆动鉴别器字段
在Rest响应中,在我的swagger文件中标记为“discriminator”的字段被复制。我有一个父对象,它有一个名为“subjectType”的字段,我已将该字段标记为鉴别器。在我的rest调用中,我只返回资源对象(基于请求中的subjectType的SubjectA对象或SubjectB对象),该对象具有以下swagger文件中提到的所有参数: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:
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
以下是回应:
{
“主题类型”:“主题”,
“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
}