- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
版本:Swagger-codegen (v3):3.0.11 | jackson :2.9.8
我目前从 swagger.yaml
文件生成我的类(由于双重复制粘贴,缩进可能会有所不同):
---
swagger: "2.0"
info:
description: "servicename"
version: "1.0"
title: "servicename"
schemes:
- "http"
- "https"
paths:
definitions:
Notification:
type: "object"
discriminator: "typeOfNotification"
properties:
typeOfNotification:
description: "Type of notification"
enum:
- "EMAIL"
- "SMS"
default: "EMAIL"
EmailNotification:
allOf:
- $ref: "#/definitions/Notification"
- type: "object"
properties:
name:
type: "string"
example: "Name of reciever"
description: "Name of the receiver"
emailAddress:
type: "string"
example: "info@stackoverflow.com"
description: "Email address of the receiver"
生成两个类:
通知.java
package nl.test;
import java.util.Objects;
import java.util.Arrays;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.IOException;
/**
* Notification
*/
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaClientCodegen", date = "2019-09-26T16:01:12.401+02:00[Europe/Amsterdam]")
public abstract class Notification {
/**
* Type of notification
*/
@JsonAdapter(TypeOfNotificationEnum.Adapter.class)
public enum TypeOfNotificationEnum {
EMAIL("EMAIL"),
SMS("SMS");
private String value;
TypeOfNotificationEnum(String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return String.valueOf(value);
}
public static TypeOfNotificationEnum fromValue(String text) {
for (TypeOfNotificationEnum b : TypeOfNotificationEnum.values()) {
if (String.valueOf(b.value).equals(text)) {
return b;
}
}
return null;
}
public static class Adapter extends TypeAdapter<TypeOfNotificationEnum> {
@Override
public void write(final JsonWriter jsonWriter, final TypeOfNotificationEnum enumeration) throws IOException {
jsonWriter.value(enumeration.getValue());
}
@Override
public TypeOfNotificationEnum read(final JsonReader jsonReader) throws IOException {
String value = jsonReader.nextString();
return TypeOfNotificationEnum.fromValue(String.valueOf(value));
}
}
} @SerializedName("typeOfNotification")
private TypeOfNotificationEnum typeOfNotification = null;
public Notification typeOfNotification(TypeOfNotificationEnum typeOfNotification) {
this.typeOfNotification = typeOfNotification;
return this;
}
@Schema(description = "Type of notification")
public TypeOfNotificationEnum getTypeOfNotification() {
return typeOfNotification;
}
public void setTypeOfNotification(TypeOfNotificationEnum typeOfNotification) {
this.typeOfNotification = typeOfNotification;
}
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Notification notification = (Notification) o;
return Objects.equals(this.typeOfNotification, notification.typeOfNotification);
}
@Override
public int hashCode() {
return Objects.hash(typeOfNotification);
}
}
以及电子邮件通知:
package nl.test;
import java.util.Objects;
import java.util.Arrays;
import com.google.gson.TypeAdapter;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.annotations.SerializedName;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import io.swagger.v3.oas.annotations.media.Schema;
import java.io.IOException;
import nl.test.Notification;
/**
* EmailNotification
*/
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.JavaClientCodegen", date = "2019-09-26T16:01:12.401+02:00[Europe/Amsterdam]")
public class EmailNotification extends Notification {
@SerializedName("name")
private String name = null;
@SerializedName("emailAddress")
private String emailAddress = null;
public EmailNotification name(String name) {
this.name = name;
return this;
}
/**
* Name of the receiver
* @return name
**/
@Schema(example = "Name of receiver", description = "Name of the receiver")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public EmailNotification emailAddress(String emailAddress) {
this.emailAddress = emailAddress;
return this;
}
/**
* Email address of the receiver
* @return emailAddress
**/
@Schema(example = "test@stackoverflow.com", description = "Email address of the receiver")
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
@Override
public boolean equals(java.lang.Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
EmailNotification = (EmailNotification) o;
return Objects.equals(this.name, emailNotification.name) &&
Objects.equals(this.emailAddress, emailNotification.emailAddress) &&
super.equals(o);
}
@Override
public int hashCode() {
return Objects.hash(name, emailAddress, super.hashCode());
}
}
这很好。但是现在在JSON的反序列化过程中出现了问题。当向 ObjectMapper 传递与 User
类对应的 JSON 时,该类具有一个 Notification
类型的属性,并且该 JSON 实际上是 EmailNotification
类型,然后由于某种原因,反序列化器不关心并将其反序列化为 Notification
,从而忽略 emailAddress
属性。
对应的测试类:
package nl.test;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.threeten.bp.LocalDate;
import static com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS;
import static org.junit.Assert.*;
@RunWith(MockitoJUnitRunner.class)
public class ObjectMappersConfigurationTest {
@Test
public void test() throws Exception {
String json = "{\n" +
" \"user\": {\n" +
" \"notification\": {\n" +
" \"name\": \"somename\",\n" +
" \"emailAddress\": \"test@stackoverflow.com\",\n" +
" \"typeOfNotification\": \"EMAIL\"\n" +
" },\n" +
" }\n" +
"}\n";
ObjectMapper mapper = createJsonObjectMapper();
User order = mapper.readValue(json, User.class);
assertEquals(1, 1);
}
public ObjectMapper createJsonObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
setDefaultRelaxObjectMappings(objectMapper);
return objectMapper;
}
public static void setDefaultRelaxObjectMappings(ObjectMapper objectMapper) {
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.enable(ACCEPT_CASE_INSENSITIVE_ENUMS);
}
}
输出将是:
User {
notification {
notificationType: EMAIL
}
}
我期望的地方:
User {
notification {
notificationType: EMAIL,
emailAddress: "...",
name: "..."
}
}
现在我知道我可以使用自定义反序列化器来实现此目的,但这似乎有点矫枉过正,我认为通过继承反序列化对象应该是一个简单的设置。我只是似乎找不到它。
启用默认类型是一种替代方案,但我宁愿避免这样做,因为我们的 YAML 文件来自外部方,在我看来,强制他们默认类型的 YAML 并不是最好的解决方案。
最佳答案
事实证明,@JsonSubType
注释丢失了。由于 ObjectMapper
不与 swagger 通信,因此它永远不知道该类应该映射到 EmailNotification
,因此总是会创建一个 Notification
对象。
添加:
<plugin>
....
<configuration>
...
<library>jersey2</library>
</configuration>
</plugin>
修复了这个问题,Notification
类的类注释现在生成为:
@JsonSubTypes({
@JsonSubTypes.Type(value = SMSNotification.class, name = "SMSNotification"),
@JsonSubTypes.Type(value = EmailNotification.class, name = "EmailNotification"),
})
public class Notification {
....
这会添加 ObjectMapper
在反序列化时可以理解的映射。
特别感谢您提供的答案在这里swagger-codegen client: How to include jackson annotations on models
关于java - 生成的子类结果反序列化到父对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58119943/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!