diff --git a/.gitignore b/.gitignore
index e75c88cf..a7721135 100644
--- a/.gitignore
+++ b/.gitignore
@@ -54,3 +54,12 @@ buildNumber.properties
# Mac
.DS_Store
+
+# Eclipse
+asyncapi-plugin/asyncapi-plugin-maven/.settings/org.eclipse.jdt.core.prefs
+asyncapi-plugin/asyncapi-plugin-maven/.project
+asyncapi-plugin/.project
+asyncapi-core/.project
+.vscode/settings.json
+asyncapi-core/.settings/org.eclipse.jdt.core.prefs
+.project
diff --git a/asyncapi-core/pom.xml b/asyncapi-core/pom.xml
index 5d66c42d..c1efe550 100644
--- a/asyncapi-core/pom.xml
+++ b/asyncapi-core/pom.xml
@@ -6,7 +6,7 @@
asyncapi
com.asyncapi
- 1.0.0-EAP-1
+ 1.0.1-EAP-1
4.0.0
@@ -28,7 +28,7 @@
org.jetbrains.kotlin
- kotlin-stdlib-jdk8
+ kotlin-stdlib
test
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ChannelBindingsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ChannelBindingsDeserializer.java
index b8fafccf..de14ee16 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ChannelBindingsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ChannelBindingsDeserializer.java
@@ -9,6 +9,7 @@
import com.asyncapi.v2.binding.nats.NATSChannelBinding;
import com.asyncapi.v2.binding.redis.RedisChannelBinding;
import com.asyncapi.v2.binding.sns.SNSChannelBinding;
+import com.asyncapi.v2.binding.solace.SolaceChannelBinding;
import com.asyncapi.v2.binding.sqs.SQSChannelBinding;
import com.asyncapi.v2.binding.stomp.STOMPChannelBinding;
import com.asyncapi.v2.binding.ws.WebSocketsChannelBinding;
@@ -68,6 +69,7 @@ private T chooseKnownPojo(String bindingKey, JsonNode
case "nats": return (T) objectMapper.readValue(binding.toString(), NATSChannelBinding.class);
case "redis": return (T) objectMapper.readValue(binding.toString(), RedisChannelBinding.class);
case "sns": return (T) objectMapper.readValue(binding.toString(), SNSChannelBinding.class);
+ case "solace": return (T) objectMapper.readValue(binding.toString(), SolaceChannelBinding.class);
case "sqs": return (T) objectMapper.readValue(binding.toString(), SQSChannelBinding.class);
case "stomp": return (T) objectMapper.readValue(binding.toString(), STOMPChannelBinding.class);
case "ws": return (T) objectMapper.readValue(binding.toString(), WebSocketsChannelBinding.class);
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/MessageBindingsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/MessageBindingsDeserializer.java
index 9c873372..48aee79b 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/MessageBindingsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/MessageBindingsDeserializer.java
@@ -9,6 +9,7 @@
import com.asyncapi.v2.binding.nats.NATSMessageBinding;
import com.asyncapi.v2.binding.redis.RedisMessageBinding;
import com.asyncapi.v2.binding.sns.SNSMessageBinding;
+import com.asyncapi.v2.binding.solace.SolaceMessageBinding;
import com.asyncapi.v2.binding.sqs.SQSMessageBinding;
import com.asyncapi.v2.binding.stomp.STOMPMessageBinding;
import com.asyncapi.v2.binding.ws.WebSocketsMessageBinding;
@@ -68,6 +69,7 @@ private T chooseKnownPojo(String bindingKey, JsonNode
case "nats": return (T) objectMapper.readValue(binding.toString(), NATSMessageBinding.class);
case "redis": return (T) objectMapper.readValue(binding.toString(), RedisMessageBinding.class);
case "sns": return (T) objectMapper.readValue(binding.toString(), SNSMessageBinding.class);
+ case "solace": return (T) objectMapper.readValue(binding.toString(), SolaceMessageBinding.class);
case "sqs": return (T) objectMapper.readValue(binding.toString(), SQSMessageBinding.class);
case "stomp": return (T) objectMapper.readValue(binding.toString(), STOMPMessageBinding.class);
case "ws": return (T) objectMapper.readValue(binding.toString(), WebSocketsMessageBinding.class);
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/OperationBindingsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/OperationBindingsDeserializer.java
index ce67be04..2bc6ac0f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/OperationBindingsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/OperationBindingsDeserializer.java
@@ -9,6 +9,7 @@
import com.asyncapi.v2.binding.nats.NATSOperationBinding;
import com.asyncapi.v2.binding.redis.RedisOperationBinding;
import com.asyncapi.v2.binding.sns.SNSOperationBinding;
+import com.asyncapi.v2.binding.solace.SolaceOperationBinding;
import com.asyncapi.v2.binding.sqs.SQSOperationBinding;
import com.asyncapi.v2.binding.stomp.STOMPOperationBinding;
import com.asyncapi.v2.binding.ws.WebSocketsOperationBinding;
@@ -68,6 +69,7 @@ private T chooseKnownPojo(String bindingKey, JsonNo
case "nats": return (T) objectMapper.readValue(binding.toString(), NATSOperationBinding.class);
case "redis": return (T) objectMapper.readValue(binding.toString(), RedisOperationBinding.class);
case "sns": return (T) objectMapper.readValue(binding.toString(), SNSOperationBinding.class);
+ case "solace": return (T) objectMapper.readValue(binding.toString(), SolaceOperationBinding.class);
case "sqs": return (T) objectMapper.readValue(binding.toString(), SQSOperationBinding.class);
case "stomp": return (T) objectMapper.readValue(binding.toString(), STOMPOperationBinding.class);
case "ws": return (T) objectMapper.readValue(binding.toString(), WebSocketsOperationBinding.class);
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ServerBindingsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ServerBindingsDeserializer.java
index 65580ba9..f0f83216 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ServerBindingsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/ServerBindingsDeserializer.java
@@ -9,6 +9,7 @@
import com.asyncapi.v2.binding.nats.NATSServerBinding;
import com.asyncapi.v2.binding.redis.RedisServerBinding;
import com.asyncapi.v2.binding.sns.SNSServerBinding;
+import com.asyncapi.v2.binding.solace.SolaceServerBinding;
import com.asyncapi.v2.binding.sqs.SQSServerBinding;
import com.asyncapi.v2.binding.stomp.STOMPServerBinding;
import com.asyncapi.v2.binding.ws.WebSocketsServerBinding;
@@ -68,6 +69,7 @@ private T chooseKnownPojo(String bindingKey, JsonNode
case "nats": return (T) objectMapper.readValue(binding.toString(), NATSServerBinding.class);
case "redis": return (T) objectMapper.readValue(binding.toString(), RedisServerBinding.class);
case "sns": return (T) objectMapper.readValue(binding.toString(), SNSServerBinding.class);
+ case "solace": return (T) objectMapper.readValue(binding.toString(), SolaceServerBinding.class);
case "sqs": return (T) objectMapper.readValue(binding.toString(), SQSServerBinding.class);
case "stomp": return (T) objectMapper.readValue(binding.toString(), STOMPServerBinding.class);
case "ws": return (T) objectMapper.readValue(binding.toString(), WebSocketsServerBinding.class);
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceChannelBinding.java
new file mode 100644
index 00000000..02ff7a62
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v2.binding.solace;
+
+import com.asyncapi.v2.binding.ChannelBinding;
+import lombok.*;
+
+/**
+ * Describes Solace channel binding.
+ *
+ * Contains information about the channel representation in Solace PubSub+ Broker.
+ * This object MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * @version 0.2.0
+ * @see Solace channel binding
+ * @author Dennis Brinley
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceMessageBinding.java
new file mode 100644
index 00000000..3fcd0abd
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v2.binding.solace;
+
+import com.asyncapi.v2.binding.MessageBinding;
+import lombok.*;
+
+/**
+ * Describes Solace message binding.
+ *
+ * Contains information about the message representation in Solace PubSub+ Broker.
+ * This object MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * @version 0.2.0
+ * @see Solace message binding
+ * @author Dennis Brinley
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceOperationBinding.java
new file mode 100644
index 00000000..b069e7f1
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceOperationBinding.java
@@ -0,0 +1,221 @@
+package com.asyncapi.v2.binding.solace;
+
+import com.asyncapi.v2.binding.OperationBinding;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+import lombok.*;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Describes Solace operation binding.
+ *
+ * Contains information about the operation representation in Solace PubSub+ Broker.
+ *
+ * @version 0.2.0
+ * @see Solace operation binding
+ * @author Dennis Brinley
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceOperationBinding extends OperationBinding {
+
+ /**
+ * Version of the binding object (e.g. bindingVersion: 0.2.0)
+ */
+ @Nullable
+ @CheckForNull
+ @JsonProperty
+ protected String bindingVersion;
+
+ /**
+ * List of destinations
+ */
+ @Nullable
+ @CheckForNull
+ @Builder.Default
+ protected List destinations = new ArrayList();
+
+ public enum SolaceDestinationType {
+ QUEUE("queue"),
+ TOPIC("topic");
+
+ private String value;
+
+ private SolaceDestinationType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return this.value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return value;
+ }
+
+ public static SolaceDestinationType fromValue(String value) {
+ if (value == null || "".equals(value)) {
+ throw new IllegalArgumentException( "Value cannot be empty or NULL" );
+ }
+
+ for (SolaceDestinationType enumEntry : SolaceDestinationType.values()) {
+ if (enumEntry.toString().equals(value)) {
+ return enumEntry;
+ }
+ }
+
+ throw new IllegalArgumentException( "Value must be member of [ queue, topic ]" );
+ }
+ }
+
+ public enum SolaceDeliveryModeType {
+ DIRECT("direct"),
+ PERISTENT("persistent");
+
+ private String value;
+
+ private SolaceDeliveryModeType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return this.value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return this.value;
+ }
+
+ public static SolaceDeliveryModeType fromValue(String value) {
+ if (value == null || "".equals(value)) {
+ throw new IllegalArgumentException( "Value cannot be empty or NULL" );
+ }
+
+ for (SolaceDeliveryModeType enumEntry : SolaceDeliveryModeType.values()) {
+ if (enumEntry.toString().equals(value)) {
+ return enumEntry;
+ }
+ }
+
+ throw new IllegalArgumentException( "Value must be member of [ direct, persistent ]" );
+ }
+ }
+
+ public enum SolaceQueueAccessType {
+ EXCLUSIVE("exclusive"),
+ NON_EXCLUSIVE("non-exclusive");
+
+ private String value;
+
+ private SolaceQueueAccessType(String value) {
+ this.value = value;
+ }
+
+ @Override
+ public String toString() {
+ return this.value;
+ }
+
+ @JsonValue
+ public String getValue() {
+ return this.value;
+ }
+
+ public static SolaceQueueAccessType fromValue(String value) {
+ if (value == null || "".equals(value)) {
+ throw new IllegalArgumentException( "Value cannot be empty or NULL" );
+ }
+
+ for (SolaceQueueAccessType enumEntry : SolaceQueueAccessType.values()) {
+ if (enumEntry.toString().equals(value)) {
+ return enumEntry;
+ }
+ }
+
+ throw new IllegalArgumentException( "Value must be member of [ exclusive, non-exclusive ]" );
+ }
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class SolaceQueueType {
+
+ @NonNull
+ @Nonnull
+ @CheckForNull
+ String name;
+
+ @CheckForNull
+ List topicSubscriptions;
+
+ @CheckForNull
+ SolaceQueueAccessType accessType;
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class SolaceTopicType {
+
+ @CheckForNull
+ @JsonProperty
+ protected List topicSubscriptions;
+ }
+
+ @Data
+ @NoArgsConstructor
+ @AllArgsConstructor
+ public static class SolaceDestination {
+
+ /**
+ * The destination type. enum SolaceDestinationType enum can be 'topic' or 'queue'
+ */
+ @NonNull
+ @Nonnull
+ @CheckForNull
+ @JsonProperty
+ protected SolaceDestinationType destinationType;
+
+ /**
+ * The delivery mode for messages associated with this destination. enum SolaceDeliveryModeType
+ * can be 'direct' or 'persistent'
+ */
+ @NonNull
+ @Nonnull
+ @CheckForNull
+ @JsonProperty
+ protected SolaceDeliveryModeType deliveryMode;
+
+ /**
+ * Solace queue destination details.
+ */
+ @Nullable
+ @CheckForNull
+ @JsonProperty
+ protected SolaceQueueType queue;
+
+ /**
+ * Solace topic destination details
+ */
+ @Nullable
+ @CheckForNull
+ @JsonProperty
+ protected SolaceTopicType topic;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceServerBinding.java
new file mode 100644
index 00000000..ac556a73
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/SolaceServerBinding.java
@@ -0,0 +1,43 @@
+package com.asyncapi.v2.binding.solace;
+
+import javax.annotation.CheckForNull;
+
+import com.asyncapi.v2.binding.ServerBinding;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * Describes Solace server binding.
+ *
+ * @version 0.2.0
+ * @see Solace server binding
+ * @author Dennis Brinley
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceServerBinding extends ServerBinding {
+
+ /**
+ * Binding version of the object
+ *
+ * e.g. bindingVersion: 0.2.0
+ */
+ @CheckForNull
+ @JsonProperty
+ protected String bindingVersion;
+
+ /**
+ * Message VPN of the Solace Broker
+ *
+ * e.g. msgVpn: solace-broker-msg-vpn
+ */
+ @CheckForNull
+ @JsonProperty
+ protected String msgVpn;
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/package-info.java b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/package-info.java
new file mode 100644
index 00000000..ed7cf09c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/binding/solace/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * This classes defines how to describe Solace-specific information on AsyncAPI.
+ *
+ * @version 0.2.0
+ * @see Solace bindings
+ */
+package com.asyncapi.v2.binding.solace;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/ChannelItem.java b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/ChannelItem.java
index 843081fe..9dfa7790 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/ChannelItem.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/ChannelItem.java
@@ -4,6 +4,9 @@
import com.asyncapi.v2.binding.ChannelBindingsDeserializer;
import com.asyncapi.v2.jackson.ChannelParametersDeserializer;
import com.asyncapi.v2.model.channel.operation.Operation;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -11,6 +14,7 @@
import lombok.NoArgsConstructor;
import javax.annotation.CheckForNull;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -31,24 +35,28 @@ public class ChannelItem {
* The referenced structure MUST be in the format of a Channel Item Object.
* If there are conflicts between the referenced definition and this Channel Item's definition, the behavior is undefined.
*/
+ @JsonProperty
@CheckForNull
private String $ref;
/**
* An optional description of this channel item. CommonMark syntax can be used for rich text representation.
*/
+ @JsonProperty
@CheckForNull
private String description;
/**
* A definition of the SUBSCRIBE operation.
*/
+ @JsonProperty
@CheckForNull
private Operation subscribe;
/**
* A definition of the PUBLISH operation.
*/
+ @JsonProperty
@CheckForNull
private Operation publish;
@@ -75,4 +83,12 @@ public class ChannelItem {
@JsonDeserialize(using = ChannelBindingsDeserializer.class)
private Map bindings;
+ /**
+ * Extension fields in the form x-extension-field-name for the exposed API.
+ */
+ @JsonAnySetter
+ @JsonAnyGetter
+ @CheckForNull
+ @Builder.Default
+ protected Map extensionFields = new HashMap();
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/Parameter.java b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/Parameter.java
index fd13f32c..c7163941 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/Parameter.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/Parameter.java
@@ -1,11 +1,18 @@
package com.asyncapi.v2.model.channel;
import com.asyncapi.v2.model.schema.Schema;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.util.HashMap;
+import java.util.Map;
+
import javax.annotation.CheckForNull;
/**
@@ -24,12 +31,14 @@ public class Parameter {
/**
* A verbose explanation of the parameter. CommonMark syntax can be used for rich text representation.
*/
+ @JsonProperty
@CheckForNull
private String description;
/**
* Definition of the parameter.
*/
+ @JsonProperty
@CheckForNull
private Schema schema;
@@ -39,7 +48,16 @@ public class Parameter {
* Even when a definition for the target field exists, it MUST NOT be used to validate this parameter but,
* instead, the schema property MUST be used.
*/
+ @JsonProperty
@CheckForNull
private String location;
+ /**
+ * Extension fields in the form x-extension-field-name for the exposed API.
+ */
+ @JsonAnySetter
+ @JsonAnyGetter
+ @CheckForNull
+ @Builder.Default
+ protected Map extensionFields = new HashMap();
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/message/Message.java b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/message/Message.java
index 92a32167..fd1eb933 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/message/Message.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/model/channel/message/Message.java
@@ -8,6 +8,9 @@
import com.asyncapi.v2.jackson.MessageTraitsDeserializer;
import com.asyncapi.v2.model.ExternalDocumentation;
import com.asyncapi.v2.model.Tag;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
@@ -17,6 +20,7 @@
import javax.annotation.CheckForNull;
import java.util.List;
import java.util.Map;
+import java.util.HashMap;
/**
* Describes a message received on a given channel and operation.
@@ -80,6 +84,7 @@ public class Message {
* A custom value MUST NOT refer to one of the schema formats listed in the table.
*/
@CheckForNull
+ @JsonProperty
private String schemaFormat;
/**
@@ -88,42 +93,49 @@ public class Message {
* defaultContentType field.
*/
@CheckForNull
+ @JsonProperty
private String contentType;
/**
* A machine-friendly name for the message.
*/
@CheckForNull
+ @JsonProperty
private String name;
/**
* A human-friendly title for the message.
*/
@CheckForNull
+ @JsonProperty
private String title;
/**
* A short summary of what the message is about.
*/
@CheckForNull
+ @JsonProperty
private String summary;
/**
* A verbose explanation of the message. CommonMark syntax can be used for rich text representation.
*/
@CheckForNull
+ @JsonProperty
private String description;
/**
* A list of tags for API documentation control. Tags can be used for logical grouping of messages.
*/
@CheckForNull
+ @JsonProperty
private List tags;
/**
* Additional external documentation for this message.
*/
@CheckForNull
+ @JsonProperty
private ExternalDocumentation externalDocs;
/**
@@ -141,6 +153,7 @@ public class Message {
* that validate against the {@link #headers} or {@link #payload} fields, respectively.
*/
@CheckForNull
+ @JsonProperty
private List