* Specifies the AsyncAPI Specification version being used.
* It can be used by tooling Specifications and clients to interpret the version.
* The structure shall be major.minor.patch, where patch versions must be compatible
* with the existing major.minor tooling.
- *
+ *
* Typically patch versions will be introduced to address errors in the documentation,
* and tooling should typically be compatible with the corresponding major.minor (1.0.*).
* Patch versions will correspond to patches of this document.
*/
@NotNull
- private String asyncapi = "2.0.0";
+ @Builder.Default
+ private final String asyncapi = "2.0.0";
/**
* Identifier of the application the AsyncAPI document is defining.
- *
+ *
* This field represents a unique universal identifier of the application the AsyncAPI document is defining.
* It must conform to the URI format, according to RFC3986.
- *
+ *
* It is RECOMMENDED to use a URN to globally and uniquely identify the application during long periods of time,
* even after it becomes unavailable or ceases to exist.
*/
@@ -62,7 +64,7 @@ public class AsyncAPI extends ExtendableObject {
* A string representing the default content type to use when encoding/decoding a message's payload.
* The value MUST be a specific media type (e.g. application/json).
* This value MUST be used by schema parsers when the contentType property is omitted.
- *
+ *
* In case a message can't be encoded/decoded using this value, schema parsers MUST use their default content type.
*/
@Nullable
@@ -70,11 +72,12 @@ public class AsyncAPI extends ExtendableObject {
/**
* Required.
- *
+ *
* Provides metadata about the API. The metadata can be used by the clients if needed.
*/
@NotNull
- private Info info;
+ @Builder.Default
+ private Info info = new Info();
/**
* Provides connection details of servers.
@@ -84,15 +87,16 @@ public class AsyncAPI extends ExtendableObject {
/**
* Required.
- *
+ *
* The available channels and messages for the API.
- *
+ *
* Holds the relative paths to the individual channel and their operations. Channel paths are relative to servers.
- *
+ *
* Channels are also known as "topics", "routing keys", "event types" or "paths".
*/
@NotNull
- private Map channels;
+ @Builder.Default
+ private Map channels = new HashMap<>();
/**
* An element to hold various schemas for the specification.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/ExternalDocumentation.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/ExternalDocumentation.java
index 9d907ea7..271780a7 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/ExternalDocumentation.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/ExternalDocumentation.java
@@ -31,10 +31,11 @@ public class ExternalDocumentation extends ExtendableObject {
/**
* Required.
- *
+ *
* The URL for the target documentation. Value MUST be in the format of a URL.
*/
@NotNull
- private String url;
+ @Builder.Default
+ private String url = "";
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Tag.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Tag.java
index 7c22b4a1..536a3d2a 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Tag.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Tag.java
@@ -27,7 +27,8 @@ public class Tag extends ExtendableObject {
* Required. The name of the tag.
*/
@NotNull
- private String name;
+ @Builder.Default
+ private String name = "";
/**
* A short description for the tag. CommonMark syntax can be used for rich text representation.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/ChannelItem.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/ChannelItem.java
index 4aec38b0..369c4980 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/ChannelItem.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/ChannelItem.java
@@ -2,7 +2,7 @@
import com.asyncapi.v2.ExtendableObject;
import com.asyncapi.v2._0_0.jackson.model.channel.ChannelParametersDeserializer;
-import com.asyncapi.v2._0_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._0_0.model.channel.operation.Operation;
import com.asyncapi.v2.binding.channel.ChannelBinding;
import com.asyncapi.v2.jackson.binding.channel.ChannelBindingsDeserializer;
@@ -64,9 +64,9 @@ public class ChannelItem extends ExtendableObject {
/**
* A map of the parameters included in the channel name.
* It SHOULD be present only when using channels with expressions (as defined by RFC 6570 section 2.2).
- *
+ *
* This map MUST contain all the parameters used in the parent channel name.
- *
+ *
* MUST BE:
*
*
{@link Reference}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/Parameter.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/Parameter.java
index 09b07170..2b5e192f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/Parameter.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/Parameter.java
@@ -40,7 +40,7 @@ public class Parameter extends ExtendableObject {
/**
* A runtime expression that specifies the location of the parameter value.
- *
+ *
* 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.
*/
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/CorrelationId.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/CorrelationId.java
index 92aa9d96..56f008a7 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/CorrelationId.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/CorrelationId.java
@@ -33,10 +33,11 @@ public class CorrelationId extends ExtendableObject {
/**
* REQUIRED.
- *
+ *
* A runtime expression that specifies the location of the correlation ID.
*/
@NotNull
- private String location;
+ @Builder.Default
+ private String location = "";
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/Message.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/Message.java
index 5a045617..7f68d20b 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/Message.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/Message.java
@@ -6,7 +6,7 @@
import com.asyncapi.v2._0_0.jackson.model.channel.message.MessagePayloadDeserializer;
import com.asyncapi.v2._0_0.jackson.model.channel.message.MessageTraitsDeserializer;
import com.asyncapi.v2._0_0.model.ExternalDocumentation;
-import com.asyncapi.v2._0_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._0_0.model.Tag;
import com.asyncapi.v2.schema.Schema;
import com.asyncapi.v2.binding.message.MessageBinding;
@@ -40,7 +40,7 @@ public class Message extends ExtendableObject {
/**
* Schema definition of the application headers. Schema MUST be of type "object".
* It MUST NOT define the protocol headers.
- *
+ *
* MUST BE:
*
*
{@link Schema}
@@ -53,7 +53,7 @@ public class Message extends ExtendableObject {
/**
* Definition of the message payload. It can be of any type but defaults to Schema object.
- *
+ *
* WILL BE:
*
*
{@link Schema}
@@ -66,7 +66,7 @@ public class Message extends ExtendableObject {
/**
* Definition of the correlation ID used for message tracing or matching.
- *
+ *
* MUST BE:
*
* {@link CorrelationId}
@@ -82,7 +82,7 @@ public class Message extends ExtendableObject {
* A string containing the name of the schema format used to define the message payload. If omitted,
* implementations should parse the payload as a Schema object. Check out the supported schema formats
* table for more information. Custom values are allowed but their implementation is OPTIONAL.
- *
+ *
* A custom value MUST NOT refer to one of the schema formats listed in the table.
*/
@Nullable
@@ -161,7 +161,7 @@ public class Message extends ExtendableObject {
/**
* A list of traits to apply to the message object. Traits MUST be merged into the message object using the JSON
* Merge Patch algorithm in the same order they are defined here. The resulting object MUST be a valid Message
- *
+ *
* MUST BE:
*
*
{@link Reference}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/MessageTrait.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/MessageTrait.java
index 34f717a9..a762936a 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/MessageTrait.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/message/MessageTrait.java
@@ -4,7 +4,7 @@
import com.asyncapi.v2._0_0.jackson.model.channel.message.MessageCorrelationIdDeserializer;
import com.asyncapi.v2._0_0.jackson.model.channel.message.MessageHeadersDeserializer;
import com.asyncapi.v2._0_0.model.ExternalDocumentation;
-import com.asyncapi.v2._0_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._0_0.model.Tag;
import com.asyncapi.v2._0_0.model.channel.operation.OperationTrait;
import com.asyncapi.v2.schema.Schema;
@@ -44,7 +44,7 @@ public class MessageTrait extends ExtendableObject {
/**
* Schema definition of the application headers. Schema MUST be of type "object".
* It MUST NOT define the protocol headers.
- *
+ *
* MUST BE:
*
*
{@link Schema}
@@ -57,7 +57,7 @@ public class MessageTrait extends ExtendableObject {
/**
* Definition of the correlation ID used for message tracing or matching.
- *
+ *
* MUST BE:
*
*
{@link CorrelationId}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/Operation.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/Operation.java
index 118fc44d..1a243f9d 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/Operation.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/Operation.java
@@ -4,7 +4,7 @@
import com.asyncapi.v2._0_0.jackson.model.channel.operation.OperationMessageDeserializer;
import com.asyncapi.v2._0_0.jackson.model.channel.operation.OperationTraitsDeserializer;
import com.asyncapi.v2._0_0.model.ExternalDocumentation;
-import com.asyncapi.v2._0_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._0_0.model.Tag;
import com.asyncapi.v2._0_0.model.channel.message.Message;
import com.asyncapi.v2.binding.operation.OperationBinding;
@@ -40,7 +40,7 @@ public class Operation extends ExtendableObject {
/**
* Unique string used to identify the operation.
- *
+ *
* The id MUST be unique among all operations described in the API. The operationId value is case-sensitive.
* Tools and libraries MAY use the operationId to uniquely identify an operation, therefore, it is RECOMMENDED
* to follow common programming naming conventions.
@@ -75,7 +75,7 @@ public class Operation extends ExtendableObject {
/**
* A map where the keys describe the name of the protocol and the values describe protocol-specific definitions
* for the operation.
- *
+ *
* Map describing protocol-specific definitions for an operation.
*/
@Nullable
@@ -85,7 +85,7 @@ public class Operation extends ExtendableObject {
/**
* A list of traits to apply to the operation object. Traits MUST be merged into the operation object using the
* JSON Merge Patch algorithm in the same order they are defined here.
- *
+ *
* MUST BE:
*
*
{@link Reference}
@@ -99,7 +99,7 @@ public class Operation extends ExtendableObject {
/**
* A definition of the message that will be published or received on this channel. oneOf is allowed here to
* specify multiple messages, however, a message MUST be valid only against one of the referenced message objects.
- *
+ *
* MUST BE:
*
*
{@link Reference}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/OperationTrait.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/OperationTrait.java
index 24f80145..d66d74e3 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/OperationTrait.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/channel/operation/OperationTrait.java
@@ -39,7 +39,7 @@ public class OperationTrait extends ExtendableObject {
/**
* Unique string used to identify the operation.
- *
+ *
* The id MUST be unique among all operations described in the API. The operationId value is case-sensitive.
* Tools and libraries MAY use the operationId to uniquely identify an operation, therefore, it is RECOMMENDED
* to follow common programming naming conventions.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/component/Components.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/component/Components.java
index 4c3f639c..c6f4660d 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/component/Components.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/component/Components.java
@@ -5,7 +5,7 @@
import com.asyncapi.v2._0_0.jackson.model.component.ComponentsParametersDeserializer;
import com.asyncapi.v2._0_0.jackson.model.component.ComponentsSchemasDeserializer;
import com.asyncapi.v2._0_0.jackson.model.component.ComponentsSecuritySchemesDeserializer;
-import com.asyncapi.v2._0_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._0_0.model.channel.Parameter;
import com.asyncapi.v2._0_0.model.channel.message.CorrelationId;
import com.asyncapi.v2._0_0.model.channel.message.Message;
@@ -49,7 +49,7 @@ public class Components extends ExtendableObject {
/**
* An object to hold reusable Schema Objects.
- *
+ *
* MUST BE:
*
*
{@link Schema}
@@ -62,7 +62,7 @@ public class Components extends ExtendableObject {
/**
* An object to hold reusable Message Objects.
- *
+ *
* MUST BE:
*
*
{@link Message}
@@ -75,7 +75,7 @@ public class Components extends ExtendableObject {
/**
* An object to hold reusable Security Scheme Objects.
- *
+ *
* MUST BE:
*
*
{@link SecurityScheme}
@@ -88,7 +88,7 @@ public class Components extends ExtendableObject {
/**
* An object to hold reusable Parameter Objects.
- *
+ *
* MUST BE:
*
*
{@link Reference}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/Info.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/Info.java
index 9bbe7ca3..61a5a338 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/Info.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/Info.java
@@ -26,21 +26,23 @@ public class Info extends ExtendableObject {
/**
* Required.
- *
+ *
* The title of the application.
*/
@NotNull
@JsonProperty
- private String title;
+ @Builder.Default
+ private String title = "";
/**
* Required.
- *
+ *
* Provides the version of the application API (not to be confused with the specification version).
*/
@NotNull
@JsonProperty
- private String version;
+ @Builder.Default
+ private String version = "";
/**
* A short description of the application. CommonMark syntax can be used for rich text representation.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/License.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/License.java
index 14780d5c..dfb6c6c4 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/License.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/info/License.java
@@ -27,7 +27,8 @@ public class License extends ExtendableObject {
* Required. The license name used for the API.
*/
@NotNull
- private String name;
+ @Builder.Default
+ private String name = "";
/**
* A URL to the license used for the API. MUST be in the format of a URL.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/server/Server.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/server/Server.java
index 36cedb5e..4d707b5a 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/server/Server.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/server/Server.java
@@ -35,24 +35,26 @@ public class Server extends ExtendableObject {
/**
* REQUIRED.
- *
+ *
* A URL to the target host. This URL supports Server Variables and MAY be relative, to indicate that the host
* location is relative to the location where the AsyncAPI document is being served. Variable substitutions will be
* made when a variable is named in {brackets}.
*/
@NotNull
@JsonProperty
- private String url;
+ @Builder.Default
+ private String url = "";
/**
* REQUIRED.
- *
+ *
* The protocol this URL supports for connection. Supported protocol include, but are not limited to:
* amqp, amqps, http, https, jms, kafka, kafka-secure, mqtt, secure-mqtt, stomp, stomps, ws, wss.
*/
@NotNull
@JsonProperty
- private String protocol;
+ @Builder.Default
+ private String protocol = "";
/**
* The version of the protocol used for connection. For instance: AMQP 0.9.1, HTTP 2.0, Kafka 1.0.0, etc.
@@ -80,10 +82,10 @@ public class Server extends ExtendableObject {
* A declaration of which security mechanisms can be used with this server. The list of values includes alternative
* security requirement objects that can be used. Only one of the security requirement objects need to be satisfied
* to authorize a connection or operation.
- *
+ *
* Lists the required security schemes to execute this operation. The name used for each property MUST correspond
* to a security scheme declared in the Security Schemes under the Components Object.
- *
+ *
* When a list of Security Requirement Objects is defined on a Server object, only one of the Security Requirement
* Objects in the list needs to be satisfied to authorize the connection.
*/
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/ChannelParametersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/ChannelParametersDeserializer.java
index 92f9efb7..9bdc2bad 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/ChannelParametersDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/ChannelParametersDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.Parameter;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java
index c0504a4f..03003e13 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.message;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.CorrelationId;
import com.asyncapi.v2.jackson.ReferenceOrObjectDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageHeadersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageHeadersDeserializer.java
index 900a3029..0fa2e91a 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageHeadersDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageHeadersDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.message;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2.schema.Schema;
import com.asyncapi.v2.jackson.ReferenceOrObjectDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageTraitsDeserializer.java
index ce9c94ba..14099ba2 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageTraitsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessageTraitsDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.message;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.MessageTrait;
import com.asyncapi.v2.jackson.ListOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessagesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessagesDeserializer.java
index 491c423c..12643960 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessagesDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/message/MessagesDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.message;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.Message;
import com.asyncapi.v2.jackson.ListOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationMessageDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationMessageDeserializer.java
index 1bcfc2c0..cccadb79 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationMessageDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationMessageDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.operation;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.Message;
import com.asyncapi.v2._6_0.model.channel.message.OneOfMessages;
import com.fasterxml.jackson.core.JsonParser;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationTraitsDeserializer.java
index 4380dd69..73df461f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationTraitsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/channel/operation/OperationTraitsDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.channel.operation;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.operation.OperationTrait;
import com.asyncapi.v2.jackson.ListOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java
index 61e64fd1..8a371a57 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.CorrelationId;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java
index 565cfb96..4b74a8f7 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.MessageTrait;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessagesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessagesDeserializer.java
index 1458b780..17e779e2 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessagesDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsMessagesDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.message.Message;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java
index 62d33c6d..f9f33397 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.operation.OperationTrait;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsParametersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsParametersDeserializer.java
index e3f573de..e11cc46f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsParametersDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsParametersDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.channel.Parameter;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSchemasDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSchemasDeserializer.java
index 8c0fcd96..d6dd235c 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSchemasDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSchemasDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2.schema.Schema;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java
index ff674c0e..8b045902 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
import com.asyncapi.v2.security_scheme.SecurityScheme;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServerVariablesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServerVariablesDeserializer.java
index 1919c12e..1b056b6f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServerVariablesDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServerVariablesDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.server.ServerVariable;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServersDeserializer.java
index 606aa5e3..b7a7c2fc 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServersDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/component/ComponentsServersDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.component;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.server.Server;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/schema/SchemaDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/schema/SchemaDeserializer.java
index f4c30c52..81940260 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/schema/SchemaDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/schema/SchemaDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.schema;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2.schema.Schema;
import com.asyncapi.v2.jackson.ReferenceOrObjectDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServerVariablesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServerVariablesDeserializer.java
index 2f45dd75..9611dfad 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServerVariablesDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServerVariablesDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.server;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.server.ServerVariable;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServersDeserializer.java
index 8be7037e..17053961 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServersDeserializer.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/jackson/model/server/ServersDeserializer.java
@@ -1,6 +1,6 @@
package com.asyncapi.v2._6_0.jackson.model.server;
-import com.asyncapi.v2._6_0.model.Reference;
+import com.asyncapi.v2.Reference;
import com.asyncapi.v2._6_0.model.server.Server;
import com.asyncapi.v2.jackson.MapOfReferencesOrObjectsDeserializer;
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/AsyncAPI.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/AsyncAPI.java
index 716b5338..017409dd 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/AsyncAPI.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/AsyncAPI.java
@@ -1,10 +1,12 @@
package com.asyncapi.v2._6_0.model;
import com.asyncapi.v2.ExtendableObject;
+import com.asyncapi.v2._6_0.jackson.model.server.ServersDeserializer;
import com.asyncapi.v2._6_0.model.channel.ChannelItem;
import com.asyncapi.v2._6_0.model.component.Components;
import com.asyncapi.v2._6_0.model.info.Info;
import com.asyncapi.v2._6_0.model.server.Server;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -13,6 +15,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -44,7 +47,8 @@ public class AsyncAPI extends ExtendableObject {
* Patch versions will correspond to patches of this document.
*/
@NotNull
- private String asyncapi = "2.6.0";
+ @Builder.Default
+ private final String asyncapi = "2.6.0";
/**
* Identifier of the application the AsyncAPI document is defining.
@@ -64,14 +68,20 @@ public class AsyncAPI extends ExtendableObject {
* Provides metadata about the API. The metadata can be used by the clients if needed.
*/
@NotNull
- private Info info;
+ @Builder.Default
+ private Info info = new Info();
/**
- * TODO: references
* Provides connection details of servers.
+ * MUST BE:
+ *
+ *
{@link Server}
+ *
{@link com.asyncapi.v2.Reference}
+ *
*/
@Nullable
- private Map servers;
+ @JsonDeserialize(using = ServersDeserializer.class)
+ private Map servers;
/**
* A string representing the default content type to use when encoding/decoding a message's payload.
@@ -93,7 +103,8 @@ public class AsyncAPI extends ExtendableObject {
* Channels are also known as "topics", "routing keys", "event types" or "paths".
*/
@NotNull
- private Map channels;
+ @Builder.Default
+ private Map channels = new HashMap<>();
/**
* An element to hold various schemas for the specification.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/ExternalDocumentation.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/ExternalDocumentation.java
index 2d4e58ad..d9023f23 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/ExternalDocumentation.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/ExternalDocumentation.java
@@ -35,6 +35,7 @@ public class ExternalDocumentation extends ExtendableObject {
* The URL for the target documentation. Value MUST be in the format of a URL.
*/
@NotNull
- private String url;
+ @Builder.Default
+ private String url = "";
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/Tag.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/Tag.java
index 565aa50f..f441e6ab 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/Tag.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/Tag.java
@@ -27,7 +27,8 @@ public class Tag extends ExtendableObject {
* Required. The name of the tag.
*/
@NotNull
- private String name;
+ @Builder.Default
+ private String name = "";
/**
* A short description for the tag. CommonMark syntax can be used for rich text representation.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/channel/ChannelItem.java b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/channel/ChannelItem.java
index 787d651c..57fcad88 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/channel/ChannelItem.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/_6_0/model/channel/ChannelItem.java
@@ -73,7 +73,7 @@ public class ChannelItem extends ExtendableObject {
*
*/
@NotNull
+ @Builder.Default
@JsonDeserialize(using = MessagesDeserializer.class)
- private List
*/
@NotNull
- private Type type;
+ @Builder.Default
+ private Type type = Type.USER_PASSWORD;
/**
* A short description for security scheme. CommonMark syntax MAY be used for rich text representation.
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpApiKeySecurityScheme.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpApiKeySecurityScheme.java
index 418098d7..13786bae 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpApiKeySecurityScheme.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpApiKeySecurityScheme.java
@@ -18,7 +18,7 @@
@Data
@NoArgsConstructor
@AllArgsConstructor
-@EqualsAndHashCode(callSuper = false)
+@EqualsAndHashCode(callSuper = true)
public class HttpApiKeySecurityScheme extends SecurityScheme {
/**
@@ -27,7 +27,7 @@ public class HttpApiKeySecurityScheme extends SecurityScheme {
* The name of the header, query or cookie parameter to be used.
*/
@NotNull
- private String name;
+ private String name = "";
/**
* REQUIRED.
@@ -37,12 +37,11 @@ public class HttpApiKeySecurityScheme extends SecurityScheme {
@Nullable
private ApiKeyLocation in;
- @Builder(builderMethodName = "httpApiKeySecuritySchemeBuilder")
- public HttpApiKeySecurityScheme(@NotNull Type type,
- @Nullable String description,
+ @Builder(builderMethodName = "httpApiKeyBuilder")
+ public HttpApiKeySecurityScheme(@Nullable String description,
@NotNull String name,
@Nullable ApiKeyLocation in) {
- super(type, description);
+ super(Type.HTTP_API_KEY, description);
this.name = name;
this.in = in;
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpSecurityScheme.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpSecurityScheme.java
index 3a779403..63b77d0a 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpSecurityScheme.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/http/HttpSecurityScheme.java
@@ -17,7 +17,7 @@
@Data
@NoArgsConstructor
@AllArgsConstructor
-@EqualsAndHashCode(callSuper = false)
+@EqualsAndHashCode(callSuper = true)
public class HttpSecurityScheme extends SecurityScheme {
/**
@@ -26,7 +26,7 @@ public class HttpSecurityScheme extends SecurityScheme {
* The name of the HTTP Authorization scheme to be used in the Authorization header as defined in RFC7235.
*/
@NotNull
- private String scheme;
+ private String scheme = "";
/**
* A hint to the client to identify how the bearer token is formatted. Bearer tokens are usually generated
@@ -35,12 +35,11 @@ public class HttpSecurityScheme extends SecurityScheme {
@Nullable
private String bearerFormat;
- @Builder(builderMethodName = "httpSecuritySchemeBuilder")
- public HttpSecurityScheme(@NotNull Type type,
- @Nullable String description,
+ @Builder(builderMethodName = "httpBuilder")
+ public HttpSecurityScheme(@Nullable String description,
@NotNull String scheme,
@Nullable String bearerFormat) {
- super(type, description);
+ super(Type.HTTP, description);
this.scheme = scheme;
this.bearerFormat = bearerFormat;
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/OAuth2SecurityScheme.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/OAuth2SecurityScheme.java
index e3543d35..7bb2b660 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/OAuth2SecurityScheme.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/OAuth2SecurityScheme.java
@@ -17,7 +17,7 @@
@Data
@NoArgsConstructor
@AllArgsConstructor
-@EqualsAndHashCode(callSuper = false)
+@EqualsAndHashCode(callSuper = true)
public class OAuth2SecurityScheme extends SecurityScheme {
/**
@@ -26,13 +26,12 @@ public class OAuth2SecurityScheme extends SecurityScheme {
* An object containing configuration information for the flow types supported.
*/
@NotNull
- private OAuthFlows flows;
+ private OAuthFlows flows = new OAuthFlows();
- @Builder(builderMethodName = "oauth2SecuritySchemeBuilder")
- public OAuth2SecurityScheme(@NotNull Type type,
- @Nullable String description,
+ @Builder(builderMethodName = "oauth2Builder")
+ public OAuth2SecurityScheme(@Nullable String description,
@NotNull OAuthFlows flows) {
- super(type, description);
+ super(Type.OAUTH2, description);
this.flows = flows;
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/AuthorizationCodeOAuthFlow.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/AuthorizationCodeOAuthFlow.java
index 686a0bce..34aeba7f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/AuthorizationCodeOAuthFlow.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/AuthorizationCodeOAuthFlow.java
@@ -29,7 +29,7 @@ public class AuthorizationCodeOAuthFlow extends OAuthFlow {
* The authorization URL to be used for this flow. This MUST be in the form of an absolute URL.
*/
@NotNull
- private String authorizationUrl;
+ private String authorizationUrl = "";
/**
* REQUIRED.
@@ -37,9 +37,9 @@ public class AuthorizationCodeOAuthFlow extends OAuthFlow {
* The token URL to be used for this flow. This MUST be in the form of an absolute URL.
*/
@NotNull
- private String tokenUrl;
+ private String tokenUrl = "";
- @Builder(builderMethodName = "authorizationCodeOAuthFlowBuilder")
+ @Builder(builderMethodName = "authorizationCodeBuilder")
public AuthorizationCodeOAuthFlow(@Nullable String refreshUrl,
@NotNull Map scopes,
@NotNull String authorizationUrl,
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ClientCredentialsOAuthFlow.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ClientCredentialsOAuthFlow.java
index 749d9ca6..15e05e07 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ClientCredentialsOAuthFlow.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ClientCredentialsOAuthFlow.java
@@ -27,9 +27,9 @@ public class ClientCredentialsOAuthFlow extends OAuthFlow {
* The token URL to be used for this flow. This MUST be in the form of a URL.
*/
@NotNull
- private String tokenUrl;
+ private String tokenUrl = "";
- @Builder(builderMethodName = "clientCredentialsOAuthFlowBuilder")
+ @Builder(builderMethodName = "clientCredentialsBuilder")
public ClientCredentialsOAuthFlow(@Nullable String refreshUrl,
@NotNull Map scopes,
@NotNull String tokenUrl) {
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ImplicitOAuthFlow.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ImplicitOAuthFlow.java
index 704117b4..6518da51 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ImplicitOAuthFlow.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/ImplicitOAuthFlow.java
@@ -27,9 +27,9 @@ public class ImplicitOAuthFlow extends OAuthFlow {
* The authorization URL to be used for this flow. This MUST be in the form of a URL
*/
@NotNull
- private String authorizationUrl;
+ private String authorizationUrl = "";
- @Builder(builderMethodName = "implicitOAuthFlowBuilder")
+ @Builder(builderMethodName = "implicitBuilder")
public ImplicitOAuthFlow(@Nullable String refreshUrl,
@NotNull Map scopes,
@NotNull String authorizationUrl) {
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/OAuthFlow.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/OAuthFlow.java
index 4fec68c3..27e63b29 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/OAuthFlow.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/OAuthFlow.java
@@ -9,6 +9,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -31,7 +32,8 @@ public class OAuthFlow extends ExtendableObject {
* The URL to be used for obtaining refresh tokens. This MUST be in the form of an absolute URL.
*/
@Nullable
- private String refreshUrl;
+ @Builder.Default
+ private String refreshUrl = "";
/**
* REQUIRED.
@@ -39,6 +41,7 @@ public class OAuthFlow extends ExtendableObject {
* The available scopes for the OAuth2 security scheme. A map between the scope name and a short description for it.
*/
@NotNull
- private Map scopes;
+ @Builder.Default
+ private Map scopes = new HashMap<>();
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/PasswordOAuthFlow.java b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/PasswordOAuthFlow.java
index 750ba2d3..693d219c 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/PasswordOAuthFlow.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v2/security_scheme/oauth2/flow/PasswordOAuthFlow.java
@@ -27,9 +27,9 @@ public class PasswordOAuthFlow extends OAuthFlow {
* The token URL to be used for this flow. This MUST be in the form of a URL.
*/
@NotNull
- private String tokenUrl;
+ private String tokenUrl = "";
- @Builder(builderMethodName = "passwordOAuthFlowBuilder")
+ @Builder(builderMethodName = "passwordBuilder")
public PasswordOAuthFlow(@Nullable String refreshUrl,
@NotNull Map scopes,
@NotNull String tokenUrl) {
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/ExtendableObject.java b/asyncapi-core/src/main/java/com/asyncapi/v3/ExtendableObject.java
new file mode 100644
index 00000000..f8bb988a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/ExtendableObject.java
@@ -0,0 +1,56 @@
+package com.asyncapi.v3;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * While the AsyncAPI Specification tries to accommodate most use cases,
+ * additional data can be added to extend the specification at certain points.
+ *
+ * The extensions properties are implemented as patterned fields that are always prefixed by "x-".
+ *
+ * The extensions may or may not be supported by the available tooling, but those may be extended as
+ * well to add requested support (if tools are internal or open-sourced).
+ *
+ * @see Specification Extensions
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonIgnoreProperties({"extensionFields"})
+public class ExtendableObject {
+
+ private static final Pattern extensionPropertyNamePattern = Pattern.compile("^x-[\\w.\\x2d_]+$");
+
+ /**
+ * Extension fields in the form x-extension-field-name for the exposed API.
+ */
+ @Nullable
+ @JsonAnyGetter
+ protected Map extensionFields;
+
+ @JsonAnySetter
+ protected final void readExtensionProperty(String name, Object value) {
+ if (extensionPropertyNamePattern.matcher(name).matches()) {
+ if (extensionFields == null) {
+ extensionFields = new HashMap<>();
+ }
+
+ extensionFields.put(name, value);
+ } else {
+ throw new IllegalArgumentException(String.format("\"%s\" is not valid extension property", name));
+ }
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Reference.java b/asyncapi-core/src/main/java/com/asyncapi/v3/Reference.java
similarity index 59%
rename from asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Reference.java
rename to asyncapi-core/src/main/java/com/asyncapi/v3/Reference.java
index 3e417e76..05ac7c2f 100644
--- a/asyncapi-core/src/main/java/com/asyncapi/v2/_0_0/model/Reference.java
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/Reference.java
@@ -1,4 +1,4 @@
-package com.asyncapi.v2._0_0.model;
+package com.asyncapi.v3;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
@@ -8,18 +8,20 @@
/**
* A simple object to allow referencing other components in the specification, internally and externally.
- *
- * The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.
+ *
+ * The Reference Object is defined by JSON Reference and follows the same structure, behavior and rules.
* A JSON Reference SHALL only be used to refer to a schema that is formatted in either JSON or YAML.
* In the case of a YAML-formatted Schema, the JSON Reference SHALL be applied to the JSON representation of
- * that schema. The JSON representation SHALL be made by applying the conversion described here.
- *
+ * that schema. The JSON representation SHALL be made by applying the conversion described here.
+ *
* For this specification, reference resolution is done as defined by the JSON Reference specification and not by
* the JSON Schema specification.
+ *
+ * This object cannot be extended with additional properties and any properties added SHALL be ignored.
*
- * @version 2.0.0
- * @see Reference
+ * @see Reference
* @author Pavel Bodiachevskii
+ * @version 3.0.0
*/
@Data
@NoArgsConstructor
@@ -27,12 +29,12 @@
public class Reference {
/**
- * Required.
- *
+ * Required.
+ *
* The reference string.
*/
@NotNull
@JsonProperty(value = "$ref")
- private String ref;
+ private String ref = "";
}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/ExternalDocumentationDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/ExternalDocumentationDeserializer.java
new file mode 100644
index 00000000..b09ac314
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/ExternalDocumentationDeserializer.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3._0_0.jackson.model;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3.jackson.ReferenceOrObjectDeserializer;
+
+/**
+ * Deserializes external documentation.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class ExternalDocumentationDeserializer extends ReferenceOrObjectDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return ExternalDocumentation.class;
+ }
+
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/TagsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/TagsDeserializer.java
new file mode 100644
index 00000000..71e39397
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/TagsDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.jackson.ListOfReferencesOrObjectsDeserializer;
+
+/**
+ * Deserializes tags.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class TagsDeserializer extends ListOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Tag.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelParametersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelParametersDeserializer.java
new file mode 100644
index 00000000..88e86b94
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelParametersDeserializer.java
@@ -0,0 +1,25 @@
+package com.asyncapi.v3._0_0.jackson.model.channel;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.Parameter;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes {@link com.asyncapi.v3._0_0.model.channel.Parameter} variables map.
+ *
+ * @version 3.0.0
+ * @author Pavel Bodiachevskii
+ */
+public class ChannelParametersDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Parameter.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelsDeserializer.java
new file mode 100644
index 00000000..c5cc3c01
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/ChannelsDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model.channel;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.Channel;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes component channels map.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class ChannelsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Channel.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java
new file mode 100644
index 00000000..7c0988c2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageCorrelationIdDeserializer.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3._0_0.jackson.model.channel.message;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.CorrelationId;
+import com.asyncapi.v3.jackson.ReferenceOrObjectDeserializer;
+
+/**
+ * Serializes message correlation id.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class MessageCorrelationIdDeserializer extends ReferenceOrObjectDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return CorrelationId.class;
+ }
+
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageHeadersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageHeadersDeserializer.java
new file mode 100644
index 00000000..6bcb98c0
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageHeadersDeserializer.java
@@ -0,0 +1,77 @@
+package com.asyncapi.v3._0_0.jackson.model.channel.message;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3.schema.Schema;
+import com.asyncapi.v3.schema.MultiFormatSchema;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+/**
+ * Serializes message traits list.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class MessageHeadersDeserializer extends JsonDeserializer {
+
+ @Override
+ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+ ObjectCodec objectCodec = p.getCodec();
+ JsonNode node = objectCodec.readTree(p);
+
+ /*
+ Problem:
+ Both, Reference class and Schema class have $ref field.
+ So, this is only reason why I receive next exception:
+ "com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
+ Unrecognized field "title" (class com.asyncapi.v2._6_0.model.Reference),
+ not marked as ignorable (one known property: "$ref"])"
+ in case when Schema contains $ref.
+ Solution:
+ Try to deserialize reference. In case of exception, try to deserialize it as given ObjectType. In case of
+ one more exception, throw it.
+ TODO: Think how to improve.
+ */
+ try {
+ return chooseKnownPojo(node, objectCodec);
+ } catch (UnrecognizedPropertyException unrecognizedPropertyException) {
+ return readAsObject(node, objectCodec);
+ }
+ }
+
+ private Object chooseKnownPojo(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ JsonNode ref = jsonNode.get("$ref");
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ if (isMultiFormatSchema(jsonNode)) {
+ return jsonParser.readValueAs(MultiFormatSchema.class);
+ }
+
+ if (ref != null) {
+ return jsonParser.readValueAs(Reference.class);
+ } else {
+ return jsonParser.readValueAs(Schema.class);
+ }
+ }
+ }
+
+ private Object readAsObject(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ return jsonParser.readValueAs(Schema.class);
+ }
+ }
+
+ private boolean isMultiFormatSchema(@NotNull JsonNode jsonNode) {
+ JsonNode schemaFormat = jsonNode.get("schemaFormat");
+ JsonNode schema = jsonNode.get("schema");
+
+ return (schemaFormat != null) && (schema != null);
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagePayloadDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagePayloadDeserializer.java
new file mode 100644
index 00000000..dcf51156
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagePayloadDeserializer.java
@@ -0,0 +1,77 @@
+package com.asyncapi.v3._0_0.jackson.model.channel.message;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3.schema.MultiFormatSchema;
+import com.asyncapi.v3.schema.Schema;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+
+/**
+ * Serializes message traits list.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class MessagePayloadDeserializer extends JsonDeserializer {
+
+ @Override
+ public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+ ObjectCodec objectCodec = p.getCodec();
+ JsonNode node = objectCodec.readTree(p);
+
+ /*
+ Problem:
+ Both, Reference class and Schema class have $ref field.
+ So, this is only reason why I receive next exception:
+ "com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
+ Unrecognized field "title" (class com.asyncapi.v2._6_0.model.Reference),
+ not marked as ignorable (one known property: "$ref"])"
+ in case when Schema contains $ref.
+ Solution:
+ Try to deserialize reference. In case of exception, try to deserialize it as given ObjectType. In case of
+ one more exception, throw it.
+ TODO: Think how to improve.
+ */
+ try {
+ return chooseKnownPojo(node, objectCodec);
+ } catch (UnrecognizedPropertyException unrecognizedPropertyException) {
+ return readAsObject(node, objectCodec);
+ }
+ }
+
+ private Object chooseKnownPojo(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ JsonNode ref = jsonNode.get("$ref");
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ if (isMultiFormatSchema(jsonNode)) {
+ return jsonParser.readValueAs(MultiFormatSchema.class);
+ }
+
+ if (ref != null) {
+ return jsonParser.readValueAs(Reference.class);
+ } else {
+ return jsonParser.readValueAs(Schema.class);
+ }
+ }
+ }
+
+ private Object readAsObject(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ return jsonParser.readValueAs(Schema.class);
+ }
+ }
+
+ private boolean isMultiFormatSchema(@NotNull JsonNode jsonNode) {
+ JsonNode schemaFormat = jsonNode.get("schemaFormat");
+ JsonNode schema = jsonNode.get("schema");
+
+ return (schemaFormat != null) && (schema != null);
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageTraitsDeserializer.java
new file mode 100644
index 00000000..c5e5058a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessageTraitsDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model.channel.message;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.MessageTrait;
+import com.asyncapi.v3.jackson.ListOfReferencesOrObjectsDeserializer;
+
+/**
+ * Deserializes message traits.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class MessageTraitsDeserializer extends ListOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return MessageTrait.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagesDeserializer.java
new file mode 100644
index 00000000..8438ddc2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/channel/message/MessagesDeserializer.java
@@ -0,0 +1,25 @@
+package com.asyncapi.v3._0_0.jackson.model.channel.message;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.Message;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes {@link Message} variables map.
+ *
+ * @version 3.0.0
+ * @author Pavel Bodiachevskii
+ */
+public class MessagesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Message.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsChannelsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsChannelsDeserializer.java
new file mode 100644
index 00000000..3a233979
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsChannelsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.Channel;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsChannelsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Channel.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java
new file mode 100644
index 00000000..3ca82f14
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsCorrelationIdsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.CorrelationId;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsCorrelationIdsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return CorrelationId.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsExternalDocsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsExternalDocsDeserializer.java
new file mode 100644
index 00000000..238f3197
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsExternalDocsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsExternalDocsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return ExternalDocumentation.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java
new file mode 100644
index 00000000..766c33c1
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessageTraitsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.MessageTrait;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsMessageTraitsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return MessageTrait.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessagesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessagesDeserializer.java
new file mode 100644
index 00000000..26c6c2e6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsMessagesDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.message.Message;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsMessagesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Message.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java
new file mode 100644
index 00000000..23e65e59
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationTraitsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.OperationTrait;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsOperationTraitsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationTrait.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationsDeserializer.java
new file mode 100644
index 00000000..d78264e2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsOperationsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.Operation;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsOperationsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Operation.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsParametersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsParametersDeserializer.java
new file mode 100644
index 00000000..b35829d3
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsParametersDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.channel.Parameter;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsParametersDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Parameter.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsRepliesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsRepliesDeserializer.java
new file mode 100644
index 00000000..97f5e213
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsRepliesDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReply;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsRepliesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationReply.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsReplyAddressesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsReplyAddressesDeserializer.java
new file mode 100644
index 00000000..369f9154
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsReplyAddressesDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReplyAddress;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsReplyAddressesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationReplyAddress.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSchemasDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSchemasDeserializer.java
new file mode 100644
index 00000000..713d49b5
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSchemasDeserializer.java
@@ -0,0 +1,95 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3.schema.MultiFormatSchema;
+import com.asyncapi.v3.schema.Schema;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.ObjectCodec;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.jetbrains.annotations.NotNull;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ComponentsSchemasDeserializer extends JsonDeserializer {
+
+ public Class objectTypeClass() {
+ return Schema.class;
+ }
+
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+ @Override
+ public Map deserialize(JsonParser jsonParser,
+ DeserializationContext deserializationContext
+ ) throws IOException, JsonProcessingException {
+ ObjectCodec objectCodec = jsonParser.getCodec();
+ JsonNode map = objectCodec.readTree(jsonParser);
+
+ Map parameters = new HashMap<>();
+
+ map.fieldNames().forEachRemaining(
+ fieldName -> {
+ /*
+ Problem:
+ Both, Reference class and Schema class have $ref field.
+ So, this is only reason why I receive next exception:
+ "com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
+ Unrecognized field "title" (class com.asyncapi.v2._6_0.model.Reference),
+ not marked as ignorable (one known property: "$ref"])"
+ in case when Schema contains $ref.
+ Solution:
+ Try to deserialize reference. In case of exception, try to deserialize it as given ObjectType. In case of
+ one more exception, throw it.
+ TODO: Think how to improve.
+ */
+ try {
+ parameters.put(fieldName, chooseKnownPojo(map.get(fieldName), objectCodec));
+ } catch (IOException ignore) {
+ try {
+ parameters.put(fieldName, readAsObject(map.get(fieldName), objectCodec));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ );
+
+ return parameters;
+ }
+
+ private Object chooseKnownPojo(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ JsonNode ref = jsonNode.get("$ref");
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ if (isMultiFormatSchema(jsonNode)) {
+ return jsonParser.readValueAs(MultiFormatSchema.class);
+ }
+
+ if (ref != null) {
+ return jsonParser.readValueAs(referenceClass());
+ } else {
+ return jsonParser.readValueAs(objectTypeClass());
+ }
+ }
+ }
+
+ private Object readAsObject(JsonNode jsonNode, ObjectCodec objectCodec) throws IOException {
+ try (JsonParser jsonParser = jsonNode.traverse(objectCodec)) {
+ return jsonParser.readValueAs(objectTypeClass());
+ }
+ }
+
+ private boolean isMultiFormatSchema(@NotNull JsonNode jsonNode) {
+ JsonNode schemaFormat = jsonNode.get("schemaFormat");
+ JsonNode schema = jsonNode.get("schema");
+
+ return (schemaFormat != null) && (schema != null);
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java
new file mode 100644
index 00000000..57f0dbbd
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsSecuritySchemesDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+import com.asyncapi.v3.security_scheme.SecurityScheme;
+
+public class ComponentsSecuritySchemesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return SecurityScheme.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServerVariablesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServerVariablesDeserializer.java
new file mode 100644
index 00000000..2836d0df
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServerVariablesDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.server.ServerVariable;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsServerVariablesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return ServerVariable.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServersDeserializer.java
new file mode 100644
index 00000000..64e77bfd
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsServersDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.server.Server;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsServersDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Server.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsTagsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsTagsDeserializer.java
new file mode 100644
index 00000000..ef193b9f
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/component/ComponentsTagsDeserializer.java
@@ -0,0 +1,19 @@
+package com.asyncapi.v3._0_0.jackson.model.component;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+public class ComponentsTagsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Tag.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationTraitsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationTraitsDeserializer.java
new file mode 100644
index 00000000..ee7cf16b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationTraitsDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model.operation;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.OperationTrait;
+import com.asyncapi.v3.jackson.ListOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes operation traits list.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class OperationTraitsDeserializer extends ListOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationTrait.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationsDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationsDeserializer.java
new file mode 100644
index 00000000..12e3b8b8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/OperationsDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model.operation;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.Operation;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes component operations map.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class OperationsDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Operation.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyAddressDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyAddressDeserializer.java
new file mode 100644
index 00000000..08d220cc
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyAddressDeserializer.java
@@ -0,0 +1,22 @@
+package com.asyncapi.v3._0_0.jackson.model.operation.reply;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReplyAddress;
+import com.asyncapi.v3.jackson.ReferenceOrObjectDeserializer;
+
+/**
+ * Serializes operation reply address
+ * @author Pavel Bodiachevskii
+ */
+public class OperationReplyAddressDeserializer extends ReferenceOrObjectDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationReplyAddress.class;
+ }
+
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyDeserializer.java
new file mode 100644
index 00000000..b019f92e
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/operation/reply/OperationReplyDeserializer.java
@@ -0,0 +1,22 @@
+package com.asyncapi.v3._0_0.jackson.model.operation.reply;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReply;
+import com.asyncapi.v3.jackson.ReferenceOrObjectDeserializer;
+
+/**
+ * Serializes operation reply
+ * @author Pavel Bodiachevskii
+ */
+public class OperationReplyDeserializer extends ReferenceOrObjectDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return OperationReply.class;
+ }
+
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServerVariablesDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServerVariablesDeserializer.java
new file mode 100644
index 00000000..2f31028a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServerVariablesDeserializer.java
@@ -0,0 +1,25 @@
+package com.asyncapi.v3._0_0.jackson.model.server;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.server.ServerVariable;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes {@link com.asyncapi.v3._0_0.model.server.Server} variables map.
+ *
+ * @version 3.0.0
+ * @author Pavel Bodiachevskii
+ */
+public class ServerVariablesDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return ServerVariable.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServersDeserializer.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServersDeserializer.java
new file mode 100644
index 00000000..9639ed77
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/jackson/model/server/ServersDeserializer.java
@@ -0,0 +1,24 @@
+package com.asyncapi.v3._0_0.jackson.model.server;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.server.Server;
+import com.asyncapi.v3.jackson.MapOfReferencesOrObjectsDeserializer;
+
+/**
+ * Serializes component servers map.
+ *
+ * @author Pavel Bodiachevskii
+ */
+public class ServersDeserializer extends MapOfReferencesOrObjectsDeserializer {
+
+ @Override
+ public Class objectTypeClass() {
+ return Server.class;
+ }
+
+ @Override
+ public Class> referenceClass() {
+ return Reference.class;
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/AsyncAPI.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/AsyncAPI.java
new file mode 100644
index 00000000..80e68798
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/AsyncAPI.java
@@ -0,0 +1,137 @@
+package com.asyncapi.v3._0_0.model;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.channel.ChannelsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.operation.OperationsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.server.ServersDeserializer;
+import com.asyncapi.v3._0_0.model.channel.Channel;
+import com.asyncapi.v3._0_0.model.component.Components;
+import com.asyncapi.v3._0_0.model.info.Info;
+import com.asyncapi.v3._0_0.model.operation.Operation;
+import com.asyncapi.v3._0_0.model.server.Server;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the root document object for the API specification.
+ * It combines resource listing and API declaration together into one document.
+ *
+ * @version 3.0.0
+ * @see AsyncAPI
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AsyncAPI extends ExtendableObject {
+
+ /**
+ * Required.
+ *
+ * Specifies the AsyncAPI Specification version being used.
+ * It can be used by tooling Specifications and clients to interpret the version.
+ * The structure shall be major.minor.patch, where patch versions must be compatible
+ * with the existing major.minor tooling.
+ *
+ * Typically patch versions will be introduced to address errors in the documentation,
+ * and tooling should typically be compatible with the corresponding major.minor (1.0.*).
+ * Patch versions will correspond to patches of this document.
+ */
+ @NotNull
+ @Builder.Default
+ private final String asyncapi = "3.0.0";
+
+ /**
+ * Identifier of the application the AsyncAPI document is defining.
+ *
+ * This field represents a unique universal identifier of the application the AsyncAPI document is defining.
+ * It must conform to the URI format, according to RFC3986.
+ *
+ * It is RECOMMENDED to use a URN to globally and uniquely identify the application during long periods of time,
+ * even after it becomes unavailable or ceases to exist.
+ */
+ @Nullable
+ private String id;
+
+ /**
+ * A string representing the default content type to use when encoding/decoding a message's payload.
+ *
+ * The value MUST be a specific media type (e.g. application/json).
+ *
+ * This value MUST be used by schema parsers when the contentType property is omitted.
+ *
+ * In case a message can't be encoded/decoded using this value, schema parsers MUST use their default content type.
+ */
+ @Nullable
+ private String defaultContentType;
+
+ /**
+ * Required.
+ *
+ * Provides metadata about the API. The metadata can be used by the clients if needed.
+ */
+ @NotNull
+ @Builder.Default
+ private Info info = new Info();
+
+ /**
+ * Provides connection details of servers.
+ *
+ * MUST BE:
+ *
+ *
{@link Server}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @Builder.Default
+ @JsonDeserialize(using = ServersDeserializer.class)
+ private Map servers = new HashMap<>();
+
+ /**
+ * The channels used by this application.
+ *
+ * MUST BE:
+ *
+ *
{@link Channel}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @Builder.Default
+ @JsonDeserialize(using = ChannelsDeserializer.class)
+ private Map channels = new HashMap<>();
+
+ /**
+ * The operations this application MUST implement.
+ *
+ * MUST BE:
+ *
+ *
{@link Operation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @Builder.Default
+ @JsonDeserialize(using = OperationsDeserializer.class)
+ private Map operations = new HashMap<>();
+
+ /**
+ * An element to hold various reusable objects for the specification.
+ *
+ * Everything that is defined inside this object represents a resource that MAY or MAY NOT be used in the
+ * rest of the document and MAY or MAY NOT be used by the implemented application.
+ */
+ @Nullable
+ private Components components;
+
+}
+
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/ExternalDocumentation.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/ExternalDocumentation.java
new file mode 100644
index 00000000..55b14b20
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/ExternalDocumentation.java
@@ -0,0 +1,37 @@
+package com.asyncapi.v3._0_0.model;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Allows referencing an external resource for extended documentation.
+ *
+ * @see ExternalDocumentation
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class ExternalDocumentation extends ExtendableObject {
+
+ /**
+ * A short description of the target documentation. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * Required.
+ *
+ * The URL for the target documentation. Value MUST be in the format of a URL.
+ */
+ @NotNull
+ @Builder.Default
+ private String url = "";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/Tag.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/Tag.java
new file mode 100644
index 00000000..7b77f09c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/Tag.java
@@ -0,0 +1,52 @@
+package com.asyncapi.v3._0_0.model;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Allows adding meta data to a single tag.
+ *
+ * @see Tag
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Tag extends ExtendableObject {
+
+ /**
+ * Required.
+ *
+ * The name of the tag.
+ */
+ @NotNull
+ @Builder.Default
+ private String name = "";
+
+ /**
+ * A short description for the tag. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * Additional external documentation for this tag.
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Channel.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Channel.java
new file mode 100644
index 00000000..8c93f831
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Channel.java
@@ -0,0 +1,158 @@
+package com.asyncapi.v3._0_0.model.channel;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessagesDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.ChannelParametersDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3._0_0.model.channel.message.Message;
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import com.asyncapi.v3.jackson.binding.channel.ChannelBindingsDeserializer;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a shared communication channel.
+ *
+ * @see Channel
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Channel extends ExtendableObject {
+
+ /**
+ * An optional string representation of this channel's address. The address is typically the "topic name",
+ * "routing key", "event type", or "path".
+ *
+ * When null or absent, it MUST be interpreted as unknown.
+ * This is useful when the address is generated dynamically at runtime or can't be known upfront.
+ *
+ * It MAY contain Channel Address Expressions like {@code {userId}}
+ *
+ * Query parameters and fragments SHALL NOT be used, instead use {@link ChannelBinding} to define them.
+ *
+ * @see Channel bindings
+ * @see Channel Address Expressions
+ */
+ @Nullable
+ private String address;
+
+ /**
+ * A human-friendly title for the channel.
+ */
+ @Nullable
+ private String title;
+
+ /**
+ * A short summary of the channel.
+ */
+ @Nullable
+ private String summary;
+
+ /**
+ * An optional description of this channel. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * An array of $ref pointers to the definition of the servers in which this channel is available.
+ *
+ * If the channel is located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getChannels()},
+ * it MUST point to a subset of server definitions located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getServers()},
+ * and MUST NOT point to a subset of server definitions located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()} or anywhere else.
+ *
+ * If the channel is located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()}, it MAY point to a Server Objects in any location.
+ *
+ * If servers is absent or empty, this channel MUST be available on all the servers defined in {@link com.asyncapi.v3._0_0.model.AsyncAPI#getServers()}.
+ *
+ * However, it is RECOMMENDED that parsers (or other software) dereference this property
+ * for a better development experience.
+ */
+ @Nullable
+ private List servers;
+
+ /**
+ * A map of the parameters included in the channel address.
+ *
+ * It MUST be present only when the address contains Channel Address Expressions like {@code {userId}}.
+ *
+ * MUST BE:
+ *
+ *
{@link Parameter}
+ *
{@link Reference}
+ *
+ *
+ * @see Channel Address Expressions
+ */
+ @Nullable
+ @JsonDeserialize(using = ChannelParametersDeserializer.class)
+ private Map parameters;
+
+ /**
+ * A map of the messages that will be sent to this channel by any application at any time.
+ *
+ * Every message sent to this channel MUST be valid against one, and only one, of the {@link Message} defined in this map.
+ *
+ * MUST BE:
+ *
+ *
{@link Message}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessagesDeserializer.class)
+ private Map messages;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the channel.
+ *
+ * MUST BE:
+ *
+ *
{@link ChannelBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ChannelBindingsDeserializer.class)
+ private Map bindings;
+
+ /**
+ * A list of tags for logical grouping of channels.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation for this channel.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Parameter.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Parameter.java
new file mode 100644
index 00000000..2196d2e2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/Parameter.java
@@ -0,0 +1,58 @@
+package com.asyncapi.v3._0_0.model.channel;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes a parameter included in a channel address.
+ *
+ * @see Parameter
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Parameter extends ExtendableObject {
+
+ /**
+ * An optional description for the parameter. CommonMark syntax MAY be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * The default value to use for substitution, and to send, if an alternate value is not supplied.
+ */
+ @Nullable
+ @JsonProperty("default")
+ private String defaultValue;
+
+ /**
+ * An enumeration of string values to be used if the substitution options are from a limited set.
+ */
+ @Nullable
+ @JsonProperty("enum")
+ private List enumValues;
+
+ /**
+ * An array of examples of the parameter value.
+ */
+ @Nullable
+ private List examples;
+
+ /**
+ * A runtime expression that specifies the location of the parameter value.
+ *
+ * @see Runtime Expression
+ */
+ @Nullable
+ private String location;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/CorrelationId.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/CorrelationId.java
new file mode 100644
index 00000000..b7bfea89
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/CorrelationId.java
@@ -0,0 +1,40 @@
+package com.asyncapi.v3._0_0.model.channel.message;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * An object that specifies an identifier at design time that can used for message tracing and correlation.
+ *
+ * For specifying and computing the location of a Correlation ID, a runtime expression is used.
+ *
+ * @see Correlation ID
+ * @see Runtime Expression
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class CorrelationId extends ExtendableObject {
+
+ /**
+ * An optional description of the identifier. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * REQUIRED.
+ *
+ * A runtime expression that specifies the location of the correlation ID.
+ */
+ @NotNull
+ @Builder.Default
+ private String location = "";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/Message.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/Message.java
new file mode 100644
index 00000000..a25dcb8c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/Message.java
@@ -0,0 +1,181 @@
+package com.asyncapi.v3._0_0.model.channel.message;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessageCorrelationIdDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessageTraitsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessageHeadersDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessagePayloadDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.jackson.binding.message.MessageBindingsDeserializer;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a message received on a given channel and operation.
+ *
+ * @see Message
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Message extends ExtendableObject {
+
+ /**
+ * Schema definition of the application headers.
+ *
+ * Schema MUST be a map of key-value pairs.
+ *
+ * It MUST NOT define the protocol headers.
+ *
+ * If this is a {@link com.asyncapi.v3.schema.Schema}, then the schemaFormat will be assumed to
+ * be "application/vnd.aai.asyncapi+json;version=asyncapi" where the version
+ * is equal to the AsyncAPI Version String.
+ *
+ * If this is a {@link com.asyncapi.v3.schema.Schema}, then the schemaFormat will be assumed to be
+ * "application/vnd.aai.asyncapi+json;version=asyncapi" where the version is equal to the AsyncAPI Version String.
+ *
+ * MUST BE:
+ *
+ *
{@link com.asyncapi.v3.schema.Schema}
+ *
{@link com.asyncapi.v3.schema.MultiFormatSchema}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessagePayloadDeserializer.class)
+ private Object payload;
+
+ /**
+ * Definition of the correlation ID used for message tracing or matching.
+ *
+ * MUST BE:
+ *
+ *
{@link CorrelationId}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @JsonDeserialize(using = MessageCorrelationIdDeserializer.class)
+ private Object correlationId;
+
+ /**
+ * The content type to use when encoding/decoding a message's payload.
+ *
+ * The value MUST be a specific media type (e.g. application/json).
+ *
+ * When omitted, the value MUST be the one specified on the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getDefaultContentType()} field.
+ */
+ @Nullable
+ private String contentType;
+
+ /**
+ * A machine-friendly name for the message.
+ */
+ @Nullable
+ private String name;
+
+ /**
+ * A human-friendly title for the message.
+ */
+ @Nullable
+ private String title;
+
+ /**
+ * A short summary of what the message is about.
+ */
+ @Nullable
+ private String summary;
+
+ /**
+ * A verbose explanation of the message. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the message.
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessageBindingsDeserializer.class)
+ private Map bindings;
+
+ /**
+ * List of examples.
+ */
+ @Nullable
+ private List examples;
+
+ /**
+ * A list of traits to apply to the message object. Traits MUST be merged using traits merge mechanism.
+ * The resulting object MUST be a valid {@link Message}.
+ *
+ *
+ * @see Traits Merge Mechanism
+ */
+ @Nullable
+ @JsonDeserialize(using = MessageTraitsDeserializer.class)
+ private List traits;
+
+ /**
+ * A list of tags for logical grouping and categorization of messages.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation for this message.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageExample.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageExample.java
new file mode 100644
index 00000000..6593ff02
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageExample.java
@@ -0,0 +1,47 @@
+package com.asyncapi.v3._0_0.model.channel.message;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+/**
+ * Message Example Object represents an example of a {@link Message} Object and MUST contain either {@link Message} headers and/or {@link Message} fields.
+ *
+ * @see Message Example
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MessageExample extends ExtendableObject {
+
+ /**
+ * The value of this field MUST validate against the {@link Message} headers field.
+ */
+ @Nullable
+ public Map headers;
+
+ /**
+ * The value of this field MUST validate against the Message {@link Message} payload field.
+ */
+ @Nullable
+ public Map payload;
+
+ /**
+ * A machine-friendly name.
+ */
+ @Nullable
+ private String name;
+
+ /**
+ * A short summary of what the example is about.
+ */
+ @Nullable
+ private String summary;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageTrait.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageTrait.java
new file mode 100644
index 00000000..fc0fad74
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/channel/message/MessageTrait.java
@@ -0,0 +1,148 @@
+package com.asyncapi.v3._0_0.model.channel.message;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessageCorrelationIdDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.channel.message.MessageHeadersDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.jackson.binding.message.MessageBindingsDeserializer;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a trait that MAY be applied to a {@link Message}.
+ *
+ * This object MAY contain any property from the {@link Message}, except {@link Message} payload and {@link Message} traits.
+ *
+ * @see Message Trait
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MessageTrait extends ExtendableObject {
+
+ /**
+ * Schema definition of the application headers.
+ *
+ * Schema MUST be a map of key-value pairs.
+ *
+ * It MUST NOT define the protocol headers.
+ *
+ * If this is a {@link com.asyncapi.v3.schema.Schema}, then the schemaFormat will be assumed to
+ * be "application/vnd.aai.asyncapi+json;version=asyncapi" where the version
+ * is equal to the AsyncAPI Version String.
+ *
+ * MUST BE:
+ *
+ *
{@link com.asyncapi.v3.schema.Schema}
+ *
{@link com.asyncapi.v3.schema.MultiFormatSchema}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessageHeadersDeserializer.class)
+ private Object headers;
+
+ /**
+ * Definition of the correlation ID used for message tracing or matching.
+ *
+ * MUST BE:
+ *
+ *
{@link CorrelationId}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @JsonDeserialize(using = MessageCorrelationIdDeserializer.class)
+ private Object correlationId;
+
+ /**
+ * The content type to use when encoding/decoding a message's payload.
+ *
+ * The value MUST be a specific media type (e.g. application/json).
+ *
+ * When omitted, the value MUST be the one specified on the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getDefaultContentType()} field.
+ */
+ @Nullable
+ private String contentType;
+
+ /**
+ * A machine-friendly name for the message.
+ */
+ @Nullable
+ private String name;
+
+ /**
+ * A human-friendly title for the message.
+ */
+ @Nullable
+ private String title;
+
+ /**
+ * A short summary of what the message is about.
+ */
+ @Nullable
+ private String summary;
+
+ /**
+ * A verbose explanation of the message. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the message.
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessageBindingsDeserializer.class)
+ private Map bindings;
+
+ /**
+ * List of examples.
+ */
+ @Nullable
+ private List examples;
+
+ /**
+ * A list of tags for logical grouping and categorization of messages.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link com.asyncapi.v3.Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation for this message.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/component/Components.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/component/Components.java
new file mode 100644
index 00000000..263425fa
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/component/Components.java
@@ -0,0 +1,297 @@
+package com.asyncapi.v3._0_0.model.component;
+
+import com.asyncapi.v3._0_0.jackson.model.component.*;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3._0_0.model.channel.Channel;
+import com.asyncapi.v3._0_0.model.channel.Parameter;
+import com.asyncapi.v3._0_0.model.channel.message.CorrelationId;
+import com.asyncapi.v3._0_0.model.channel.message.Message;
+import com.asyncapi.v3._0_0.model.channel.message.MessageTrait;
+import com.asyncapi.v3._0_0.model.operation.Operation;
+import com.asyncapi.v3._0_0.model.operation.OperationTrait;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReply;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReplyAddress;
+import com.asyncapi.v3._0_0.model.server.Server;
+import com.asyncapi.v3._0_0.model.server.ServerVariable;
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import com.asyncapi.v3.binding.server.ServerBinding;
+import com.asyncapi.v3.jackson.binding.channel.ChannelBindingsDeserializer;
+import com.asyncapi.v3.jackson.binding.message.MessageBindingsDeserializer;
+import com.asyncapi.v3.jackson.binding.operation.OperationBindingsDeserializer;
+import com.asyncapi.v3.jackson.binding.server.ServerBindingsDeserializer;
+import com.asyncapi.v3.schema.MultiFormatSchema;
+import com.asyncapi.v3.schema.Schema;
+import com.asyncapi.v3.security_scheme.SecurityScheme;
+import com.asyncapi.v3.ExtendableObject;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+/**
+ * Holds a set of reusable objects for different aspects of the AsyncAPI specification.
+ * All objects defined within the components object will have no effect on the API unless they are explicitly referenced
+ * from properties outside the components object.
+ *
+ * @see Components Object
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Components extends ExtendableObject {
+
+ /**
+ * An object to hold reusable Schema Object.
+ *
+ * If this is a {@link Schema}, then the schemaFormat will be assumed to be "application/vnd.aai.asyncapi+json;version=asyncapi"
+ * where the version is equal to the AsyncAPI Version String.
+ *
+ * MUST BE:
+ *
+ *
{@link Schema}
+ *
{@link MultiFormatSchema}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsSchemasDeserializer.class)
+ private Map schemas;
+
+ /**
+ * An object to hold reusable {@link Server} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link Server}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsServersDeserializer.class)
+ private Map servers;
+
+ /**
+ * An object to hold reusable {@link ServerVariable} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link ServerVariable}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsServerVariablesDeserializer.class)
+ private Map serverVariables;
+
+ /**
+ * An object to hold reusable {@link Channel} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link Channel}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsChannelsDeserializer.class)
+ private Map channels;
+
+ /**
+ * An object to hold reusable {@link Operation} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link Operation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsOperationsDeserializer.class)
+ private Map operations;
+
+ /**
+ * An object to hold reusable {@link OperationReply} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationReply}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsRepliesDeserializer.class)
+ private Map replies;
+
+ /**
+ * An object to hold reusable {@link OperationReplyAddress} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationReplyAddress}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsReplyAddressesDeserializer.class)
+ private Map replyAddresses;
+
+ /**
+ * An object to hold reusable {@link Message} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link Message}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsMessagesDeserializer.class)
+ private Map messages;
+
+ /**
+ * An object to hold reusable {@link SecurityScheme} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link SecurityScheme}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsSecuritySchemesDeserializer.class)
+ private Map securitySchemes;
+
+ /**
+ * An object to hold reusable {@link Parameter} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link Parameter}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsParametersDeserializer.class)
+ private Map parameters;
+
+ /**
+ * An object to hold reusable {@link CorrelationId} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link CorrelationId}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsCorrelationIdsDeserializer.class)
+ private Map correlationIds;
+
+ /**
+ * An object to hold reusable {@link OperationTrait} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationTrait}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsOperationTraitsDeserializer.class)
+ private Map operationTraits;
+
+ /**
+ * An object to hold reusable {@link MessageTrait} Objects.
+ *
+ * MUST BE:
+ *
+ *
{@link MessageTrait}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsMessageTraitsDeserializer.class)
+ private Map messageTraits;
+
+ /**
+ * An object to hold reusable {@link ServerBinding} Objects.
+ * MUST BE:
+ *
+ *
{@link ServerBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ServerBindingsDeserializer.class)
+ private Map serverBindings;
+
+ /**
+ * An object to hold reusable {@link ChannelBinding} Objects.
+ * MUST BE:
+ *
+ *
{@link ChannelBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ChannelBindingsDeserializer.class)
+ private Map channelBindings;
+
+ /**
+ * An object to hold reusable {@link OperationBinding} Objects.
+ * MUST BE:
+ *
+ *
{@link OperationBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationBindingsDeserializer.class)
+ private Map operationBindings;
+
+ /**
+ * An object to hold reusable {@link MessageBinding} Objects.
+ * MUST BE:
+ *
+ *
{@link MessageBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = MessageBindingsDeserializer.class)
+ private Map messageBindings;
+
+ /**
+ * An object to hold reusable {@link ExternalDocumentation} Objects.
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsExternalDocsDeserializer.class)
+ private Map externalDocs;
+
+ /**
+ * An object to hold reusable {@link Tag} Objects.
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ComponentsTagsDeserializer.class)
+ private Map tags;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Contact.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Contact.java
new file mode 100644
index 00000000..bd2af1b2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Contact.java
@@ -0,0 +1,39 @@
+package com.asyncapi.v3._0_0.model.info;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Contact information for the exposed API.
+ *
+ * @see Contact
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Contact extends ExtendableObject {
+
+ /**
+ * The identifying name of the contact person/organization.
+ */
+ @Nullable
+ private String name;
+
+ /**
+ * The URL pointing to the contact information. This MUST be in the form of an absolute URL.
+ */
+ @Nullable
+ private String url;
+
+ /**
+ * The email address of the contact person/organization. MUST be in the format of an email address.
+ */
+ @Nullable
+ private String email;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Info.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Info.java
new file mode 100644
index 00000000..b9a131c3
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/info/Info.java
@@ -0,0 +1,108 @@
+package com.asyncapi.v3._0_0.model.info;
+
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.ExtendableObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * The object provides metadata about the API. The metadata can be used by the clients if needed.
+ *
+ * @see Info
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Info extends ExtendableObject {
+
+ /**
+ * Required.
+ *
+ * The title of the application.
+ */
+ @NotNull
+ @JsonProperty
+ @Builder.Default
+ private String title = "";
+
+ /**
+ * Required.
+ *
+ * Provides the version of the application API (not to be confused with the specification version).
+ */
+ @NotNull
+ @JsonProperty
+ @Builder.Default
+ private String version = "";
+
+ /**
+ * A short description of the application. CommonMark syntax can be used
+ * for rich text representation.
+ */
+ @Nullable
+ @JsonProperty
+ private String description;
+
+ /**
+ * A URL to the Terms of Service for the API. This MUST be in the form of an absolute URL.
+ */
+ @Nullable
+ @JsonProperty
+ private String termsOfService;
+
+ /**
+ * The contact information for the exposed API.
+ */
+ @Nullable
+ @JsonProperty
+ private Contact contact;
+
+ /**
+ * The license information for the exposed API.
+ */
+ @Nullable
+ @JsonProperty
+ private License license;
+
+ /**
+ * A list of tags for application API documentation control. Tags can be used for logical grouping of applications.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonProperty
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation of the exposed API.
+ *
+ * The license name used for the API.
+ */
+ @NotNull
+ @Builder.Default
+ private String name = "";
+
+ /**
+ * A URL to the license used for the API. This MUST be in the form of an absolute URL.
+ */
+ @Nullable
+ private String url;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/Operation.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/Operation.java
new file mode 100644
index 00000000..81310044
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/Operation.java
@@ -0,0 +1,183 @@
+package com.asyncapi.v3._0_0.model.operation;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.operation.OperationTraitsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.operation.reply.OperationReplyDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReply;
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import com.asyncapi.v3.jackson.binding.operation.OperationBindingsDeserializer;
+import com.asyncapi.v3.jackson.security_scheme.SecuritySchemesDeserializer;
+import com.asyncapi.v3.security_scheme.SecurityScheme;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a specific operation.
+ *
+ * @see Operation
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Operation extends ExtendableObject {
+
+ /**
+ * Required.
+ *
+ * Use send when it's expected that the application will send a message to the given {@link com.asyncapi.v3._0_0.model.channel.Channel},
+ * and receive when the application should expect receiving messages from the given {@link com.asyncapi.v3._0_0.model.channel.Channel}.
+ */
+ @NotNull
+ private OperationAction action;
+
+ /**
+ * Required.
+ *
+ * A $ref pointer to the definition of the channel in which this operation is performed.
+ *
+ * If the operation is located in the root {@link com.asyncapi.v3._0_0.model.AsyncAPI#getOperations()}, it MUST point to a channel
+ * definition located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getChannels()}, and MUST NOT point to a channel definition located
+ * in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()} or anywhere else.
+ *
+ * If the operation is located in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()}, it MAY point to a Channel Object in any location.
+ * Please note the channel property value MUST be a Reference Object and, therefore, MUST NOT contain a Channel Object.
+ *
+ * However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience.
+ */
+ @NotNull
+ private Reference channel;
+
+ /**
+ * A human-friendly title for the operation.
+ */
+ @Nullable
+ private String title;
+
+ /**
+ * A short summary of what the operation is about.
+ */
+ @Nullable
+ private String summary;
+
+ /**
+ * A verbose explanation of the operation. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * A declaration of which security schemes are associated with this operation.
+ *
+ * Only one of the {@link SecurityScheme} objects MUST be satisfied to authorize an operation.
+ *
+ * In cases where Server Security also applies, it MUST also be satisfied.
+ *
+ * MUST BE:
+ *
+ *
{@link SecurityScheme}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = SecuritySchemesDeserializer.class)
+ private List security;
+
+ /**
+ * A list of tags for logical grouping and categorization of operations.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation for this channel.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the operation.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationBindingsDeserializer.class)
+ private Map bindings;
+
+ /**
+ * A list of traits to apply to the operation object. Traits MUST be merged using traits merge mechanism.
+ *
+ * The resulting object MUST be a valid {@link Operation}.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationTrait}
+ *
{@link Reference}
+ *
+ *
+ * @see Traits Merge Mechanism
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationTraitsDeserializer.class)
+ private List traits;
+
+ /**
+ * A list of $ref pointers pointing to the supported {@link com.asyncapi.v3._0_0.model.channel.message.Message} that can be processed by this operation.
+ *
+ * It MUST contain a subset of the messages defined in the channel referenced in this operation - {@link Operation#getChannel()},
+ * and MUST NOT point to a subset of message definitions located in the {@link com.asyncapi.v3._0_0.model.component.Components#getMessages()} in the {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()} or anywhere else.
+ *
+ * Every message processed by this operation MUST be valid against one, and only one, of the message objects referenced in this list.
+ *
+ * Please note the messages property value MUST be a list of Reference Objects and, therefore, MUST NOT contain Message Objects.
+ *
+ * However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience.
+ */
+ @Nullable
+ private List messages;
+
+ /**
+ * The definition of the reply in a request-reply operation.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationReply}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationReplyDeserializer.class)
+ private Object reply;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationAction.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationAction.java
new file mode 100644
index 00000000..b4b99d0a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationAction.java
@@ -0,0 +1,26 @@
+package com.asyncapi.v3._0_0.model.operation;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes a specific operation action.
+ *
+ * @see Operation
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+public enum OperationAction {
+
+ /**
+ * Use send when it's expected that the application will send a message to the given {@link com.asyncapi.v3._0_0.model.channel.Channel}.
+ */
+ @JsonProperty("send")
+ SEND,
+
+ /**
+ * Use receive when the application should expect receiving messages from the given {@link com.asyncapi.v3._0_0.model.channel.Channel}.
+ */
+ @JsonProperty("receive")
+ RECEIVE
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationTrait.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationTrait.java
new file mode 100644
index 00000000..8ea88346
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/OperationTrait.java
@@ -0,0 +1,111 @@
+package com.asyncapi.v3._0_0.model.operation;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.operation.reply.OperationReplyDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3._0_0.model.operation.reply.OperationReply;
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import com.asyncapi.v3.jackson.binding.operation.OperationBindingsDeserializer;
+import com.asyncapi.v3.jackson.security_scheme.SecuritySchemesDeserializer;
+import com.asyncapi.v3.security_scheme.SecurityScheme;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Describes a trait that MAY be applied to an {@link Operation}. This object MAY contain any property from the
+ * {@link Operation}, except the action, channel and traits ones.
+ *
+ * @see Operation
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class OperationTrait extends ExtendableObject {
+
+ /**
+ * A human-friendly title for the operation.
+ */
+ @Nullable
+ private String title;
+
+ /**
+ * A short summary of what the operation is about.
+ */
+ @Nullable
+ private String summary;
+
+ /**
+ * A verbose explanation of the operation. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * A declaration of which security schemes are associated with this operation.
+ *
+ * Only one of the {@link SecurityScheme} objects MUST be satisfied to authorize an operation.
+ *
+ * In cases where Server Security also applies, it MUST also be satisfied.
+ *
+ * MUST BE:
+ *
+ *
{@link SecurityScheme}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = SecuritySchemesDeserializer.class)
+ private List security;
+
+ /**
+ * A list of tags for logical grouping and categorization of operations.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation for this channel.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the operation.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationBindingsDeserializer.class)
+ private Map bindings;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReply.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReply.java
new file mode 100644
index 00000000..1b90ba66
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReply.java
@@ -0,0 +1,76 @@
+package com.asyncapi.v3._0_0.model.operation.reply;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.operation.reply.OperationReplyAddressDeserializer;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes the reply part that MAY be applied to an {@link com.asyncapi.v3._0_0.model.operation.Operation}.
+ *
+ * If an operation implements the request/reply pattern, the reply object represents the response message.
+ *
+ * @see Operation
+ * @see Operation Reply
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class OperationReply extends ExtendableObject {
+
+ /**
+ * Definition of the address that implementations MUST use for the reply.
+ *
+ * MUST BE:
+ *
+ *
{@link OperationReplyAddress}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = OperationReplyAddressDeserializer.class)
+ private Object address;
+
+ /**
+ * A $ref pointer to the definition of the channel in which this operation is performed.
+ *
+ * When address is specified, the address property of the channel referenced by this property MUST be either null or not defined.
+ *
+ * If the operation reply is located inside a root Operation Object - {@link com.asyncapi.v3._0_0.model.AsyncAPI#getOperations()},
+ * it MUST point to a channel definition located in the root Channels Object - {@link com.asyncapi.v3._0_0.model.AsyncAPI#getChannels()},
+ * and MUST NOT point to a channel definition located in the Components Object - {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()} or anywhere else.
+ *
+ * If the operation reply is located inside an Operation Object in the Components Object - {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()}
+ * or in the Replies Object in the Components Object - {@link com.asyncapi.v3._0_0.model.AsyncAPI#getComponents()}, it MAY point to a Channel Object in any location.
+ *
+ * Please note the channel property value MUST be a Reference Object and, therefore, MUST NOT contain a Channel Object.
+ *
+ * However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience.
+ */
+ @Nullable
+ private Reference channel;
+
+ /**
+ * A list of $ref pointers pointing to the supported {@link com.asyncapi.v3._0_0.model.channel.message.Message} that can be processed by this operation as reply.
+ *
+ * It MUST contain a subset of the messages defined in the channel referenced in this operation reply,
+ * and MUST NOT point to a subset of message definitions located in the Components Object or anywhere else.
+ *
+ * Every message processed by this operation MUST be valid against one, and only one, of the message objects referenced in this list.
+ *
+ * Please note the messages property value MUST be a list of Reference Objects and, therefore, MUST NOT contain Message Objects.
+ *
+ * However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience.
+ */
+ @Nullable
+ private List messages;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReplyAddress.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReplyAddress.java
new file mode 100644
index 00000000..8a9875ba
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/operation/reply/OperationReplyAddress.java
@@ -0,0 +1,40 @@
+package com.asyncapi.v3._0_0.model.operation.reply;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * An object that specifies where an operation has to send the reply.
+ *
+ * For specifying and computing the location of a reply address, a runtime expression is used.
+ *
+ * @see Operation Reply Address
+ * @see Runtime Expression
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class OperationReplyAddress extends ExtendableObject {
+
+ /**
+ * An optional description of the address. CommonMark syntax can be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * REQUIRED.
+ *
+ * A runtime expression that specifies the location of the reply address.
+ *
+ * @see Runtime Expression
+ */
+ @Nullable
+ private String location;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/Server.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/Server.java
new file mode 100644
index 00000000..8d38cd89
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/Server.java
@@ -0,0 +1,178 @@
+package com.asyncapi.v3._0_0.model.server;
+
+import com.asyncapi.v3.jackson.binding.server.ServerBindingsDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.server.ServerVariablesDeserializer;
+import com.asyncapi.v3.binding.server.ServerBinding;
+import com.asyncapi.v3.ExtendableObject;
+import com.asyncapi.v3.Reference;
+import com.asyncapi.v3._0_0.jackson.model.ExternalDocumentationDeserializer;
+import com.asyncapi.v3._0_0.jackson.model.TagsDeserializer;
+import com.asyncapi.v3._0_0.model.ExternalDocumentation;
+import com.asyncapi.v3._0_0.model.Tag;
+import com.asyncapi.v3.jackson.security_scheme.SecuritySchemesDeserializer;
+import com.asyncapi.v3.security_scheme.SecurityScheme;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An object representing a message broker, a server or any other kind of computer program capable of sending and/or
+ * receiving data.
+ *
+ * This object is used to capture details such as URIs, protocols and security configuration.
+ *
+ * Variable substitution can be used so that some details, for example usernames and passwords, can be injected by
+ * code generation tools.
+ *
+ * @see Server
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class Server extends ExtendableObject {
+
+ /**
+ * REQUIRED.
+ *
+ * The server host name. It MAY include the port. This field supports {@link ServerVariable}.
+ *
+ * Variable substitutions will be made when a variable is named in {braces}.
+ */
+ @NotNull
+ @JsonProperty
+ @Builder.Default
+ private String host = "";
+
+ /**
+ * REQUIRED.
+ *
+ * The protocol this URL supports for connection. Supported protocol include, but are not limited to:
+ * amqp, amqps, http, https, jms, kafka, kafka-secure, mqtt, secure-mqtt, stomp, stomps, ws, wss.
+ */
+ @NotNull
+ @JsonProperty
+ @Builder.Default
+ private String protocol = "";
+
+ /**
+ * The version of the protocol used for connection. For instance: AMQP 0.9.1, HTTP 2.0, Kafka 1.0.0, etc.
+ */
+ @Nullable
+ @JsonProperty
+ private String protocolVersion;
+
+ /**
+ * The path to a resource in the host. This field supports {@link ServerVariable}.
+ *
+ * Variable substitutions will be made when a variable is named in {braces}.
+ */
+ @Nullable
+ @JsonProperty
+ private String pathname;
+
+ /**
+ * An optional string describing the server. CommonMark syntax MAY be used for rich text representation.
+ */
+ @Nullable
+ @JsonProperty
+ private String description;
+
+ /**
+ * A human-friendly title for the server.
+ */
+ @Nullable
+ @JsonProperty
+ private String title;
+
+ /**
+ * A short summary of the server.
+ */
+ @Nullable
+ @JsonProperty
+ private String summary;
+
+ /**
+ * A map between a variable name and its value.
+ *
+ * The value is used for substitution in the server's {@link #getHost()} and {@link #getPathname()} template.
+ *
+ * MUST BE:
+ *
+ *
{@link ServerVariable}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonProperty
+ @JsonDeserialize(using = ServerVariablesDeserializer.class)
+ private Map variables;
+
+ /**
+ * A declaration of which security schemes can be used with this server. The list of values includes alternative
+ * {@link SecurityScheme} objects that can be used.
+ *
+ * Only one of the security scheme objects need to be satisfied to authorize a connection or operation.
+ *
+ * MUST BE:
+ *
+ *
{@link SecurityScheme}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonProperty
+ @JsonDeserialize(using = SecuritySchemesDeserializer.class)
+ private List security;
+
+ /**
+ * A list of tags for logical grouping and categorization of servers.
+ *
+ * MUST BE:
+ *
+ *
{@link Tag}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonProperty
+ @JsonDeserialize(using = TagsDeserializer.class)
+ private List tags;
+
+ /**
+ * Additional external documentation of the exposed API.
+ *
+ * MUST BE:
+ *
+ *
{@link ExternalDocumentation}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonProperty
+ @JsonDeserialize(using = ExternalDocumentationDeserializer.class)
+ private Object externalDocs;
+
+ /**
+ * A map where the keys describe the name of the protocol and the values describe protocol-specific definitions
+ * for the server.
+ *
+ * MUST be one of:
+ *
+ *
{@link ServerBinding}
+ *
{@link Reference}
+ *
+ */
+ @Nullable
+ @JsonDeserialize(using = ServerBindingsDeserializer.class)
+ private Map bindings;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/ServerVariable.java b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/ServerVariable.java
new file mode 100644
index 00000000..87f852e1
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/_0_0/model/server/ServerVariable.java
@@ -0,0 +1,50 @@
+package com.asyncapi.v3._0_0.model.server;
+
+import com.asyncapi.v3.ExtendableObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * An object representing a Server Variable for server URL template substitution.
+ *
+ * @see ServerVariable
+ * @author Pavel Bodiachevskii
+ * @version 3.0.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class ServerVariable extends ExtendableObject {
+
+ /**
+ * An enumeration of string values to be used if the substitution options are from a limited set.
+ */
+ @Nullable
+ @JsonProperty(value = "enum")
+ private List enumValues;
+
+ /**
+ * The default value to use for substitution, and to send, if an alternate value is not supplied.
+ */
+ @Nullable
+ @JsonProperty("default")
+ private String defaultValue;
+
+ /**
+ * An optional description for the server variable. CommonMark syntax MAY be used for rich text representation.
+ */
+ @Nullable
+ private String description;
+
+ /**
+ * An array of examples of the server variable.
+ */
+ @Nullable
+ private List examples;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ChannelBinding.java
new file mode 100644
index 00000000..825bc97b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ChannelBinding.java
@@ -0,0 +1,18 @@
+package com.asyncapi.v3.binding.channel;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Describes protocol-specific definition for a channel.
+ *
+ * Contains information about the channel exchange properties in AMQP.
+ *
+ * @version 0.2.0
+ * @see AMQP channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describes AMQP 0-9-1 channel exchange properties.")
+public class AMQPChannelExchangeProperties {
+
+ /**
+ * The name of the exchange. It MUST NOT exceed 255 characters long.
+ */
+ @Nullable
+ @javax.validation.constraints.Size(
+ max = 255,
+ message = "Exchange name must not exceed 255 characters long."
+ )
+ @JsonProperty("name")
+ @JsonPropertyDescription("The name of the exchange. It MUST NOT exceed 255 characters long.")
+ private String name;
+
+ /**
+ * The type of the exchange. Can be either topic, direct, fanout, default or headers.
+ */
+ @Nullable
+ @JsonProperty("type")
+ @JsonPropertyDescription("The type of the exchange. Can be either topic, direct, fanout, default or headers.")
+ private AMQPChannelExchangeType type;
+
+ /**
+ * Whether the exchange should survive broker restarts or not.
+ */
+ @Nullable
+ @JsonProperty("durable")
+ @JsonPropertyDescription("Whether the exchange should survive broker restarts or not.")
+ private Boolean durable;
+
+ /**
+ * Whether the exchange should be deleted when the last queue is unbound from it.
+ */
+ @Nullable
+ @JsonProperty("autoDelete")
+ @JsonPropertyDescription("Whether the exchange should be deleted when the last queue is unbound from it.")
+ private Boolean autoDelete;
+
+ /**
+ * The virtual host of the exchange. Defaults to /.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "vhost", defaultValue = "/")
+ @JsonPropertyDescription("The virtual host of the exchange. Defaults to /.")
+ private String vhost = "/";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp/exchange/AMQPChannelExchangeType.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp/exchange/AMQPChannelExchangeType.java
new file mode 100644
index 00000000..6a4211bc
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp/exchange/AMQPChannelExchangeType.java
@@ -0,0 +1,33 @@
+package com.asyncapi.v3.binding.channel.amqp.exchange;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes AMQP 0-9-1 channel exchange type.
+ *
+ * Contains information about the queue exchange properties in AMQP.
+ *
+ * @version 0.2.0
+ * @see AMQP channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describes AMQP 0-9-1 channel queue properties.")
+public class AMQPChannelQueueProperties {
+
+ /**
+ * The name of the queue. It MUST NOT exceed 255 characters long.
+ */
+ @Nullable
+ @javax.validation.constraints.Size(
+ max = 255,
+ message = "Queue name must not exceed 255 characters long."
+ )
+ @JsonProperty("name")
+ @JsonPropertyDescription("The name of the queue. It MUST NOT exceed 255 characters long.")
+ private String name;
+
+ /**
+ * Whether the queue should survive broker restarts or not.
+ */
+ @Nullable
+ @JsonProperty("durable")
+ @JsonPropertyDescription("Whether the queue should survive broker restarts or not.")
+ private Boolean durable;
+
+ /**
+ * Whether the queue should be used only by one connection or not.
+ */
+ @Nullable
+ @JsonProperty("exclusive")
+ @JsonPropertyDescription("Whether the queue should be used only by one connection or not.")
+ private Boolean exclusive;
+
+ /**
+ * Whether the queue should be deleted when the last consumer unsubscribes.
+ */
+ @Nullable
+ @JsonProperty("autoDelete")
+ @JsonPropertyDescription("Whether the queue should be deleted when the last consumer unsubscribes.")
+ private Boolean autoDelete;
+
+ /**
+ * The virtual host of the queue. Defaults to /.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "vhost", defaultValue = "/")
+ @JsonPropertyDescription("The virtual host of the queue. Defaults to /.")
+ private String vhost = "/";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp1/AMQP1ChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp1/AMQP1ChannelBinding.java
new file mode 100644
index 00000000..b9d5b157
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/amqp1/AMQP1ChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.amqp1;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * The destination (queue or exchange) name for this channel. SHOULD only be specified if the channel name differs
+ * from the actual destination name, such as when the channel name is not a valid destination name in Anypoint MQ.
+ */
+ @Nullable
+ @JsonProperty("destination")
+ @JsonPropertyDescription("The destination (queue or exchange) name for this channel. SHOULD only be specified if the channel name differs from the actual destination name, such as when the channel name is not a valid destination name in Anypoint MQ.")
+ private String destination;
+
+ /**
+ * OPTIONAL, defaults to queue.
+ *
+ * The type of destination, which MUST be either exchange or queue or fifo-queue.
+ * SHOULD be specified to document the messaging model (publish/subscribe, point-to-point, strict message ordering)
+ * supported by this channel.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "destinationType", defaultValue = "queue")
+ @JsonPropertyDescription("The type of destination, which MUST be either exchange or queue or fifo-queue. SHOULD be specified to document the messaging model (publish/subscribe, point-to-point, strict message ordering) supported by this channel.")
+ private AnypointMQChannelDestinationType destinationType = AnypointMQChannelDestinationType.QUEUE;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.0.1";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/anypointmq/AnypointMQChannelDestinationType.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/anypointmq/AnypointMQChannelDestinationType.java
new file mode 100644
index 00000000..3f42233c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/anypointmq/AnypointMQChannelDestinationType.java
@@ -0,0 +1,25 @@
+package com.asyncapi.v3.binding.channel.anypointmq;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes Anypoint MQ channel destination type.
+ *
+ * @version 0.0.1
+ * @see Anypoint MQ channel binding
+ * @author Pavel Bodiachevskii
+ */
+@JsonClassDescription("Describes Anypoint MQ channel destination type.")
+public enum AnypointMQChannelDestinationType {
+
+ @JsonProperty("exchange")
+ EXCHANGE,
+
+ @JsonProperty("queue")
+ QUEUE,
+
+ @JsonProperty("fifo-queue")
+ FIFO_QUEUE
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelBinding.java
new file mode 100644
index 00000000..1f93f6c2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelBinding.java
@@ -0,0 +1,83 @@
+package com.asyncapi.v3.binding.channel.googlepubsub;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+/**
+ * Describes Google Cloud Pub/Sub channel binding.
+ *
+ * The Channel Bindings Object is used to describe the Google Cloud Pub/Sub specific Topic details with AsyncAPI.
+ *
+ * @version 0.1.0
+ * @see Google Cloud Pub/Sub channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Google Cloud Pub/Sub channel binding.")
+public class GooglePubSubChannelBinding extends ChannelBinding {
+
+ /**
+ * The Google Cloud Pub/Sub Topic name.
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "topic", required = true)
+ @JsonPropertyDescription("The Google Cloud Pub/Sub Topic name.")
+ private String topic = "";
+
+ /**
+ * An object of key-value pairs (These are used to categorize Cloud Resources like Cloud Pub/Sub Topics.)
+ */
+ @Nullable
+ @JsonProperty("labels")
+ @JsonPropertyDescription("An object of key-value pairs (These are used to categorize Cloud Resources like Cloud Pub/Sub Topics.)")
+ private Map labels;
+
+ /**
+ * Indicates the minimum duration to retain a message after it is published to the topic (Must be a valid Duration.)
+ */
+ @Nullable
+ @JsonProperty("messageRetentionDuration")
+ @JsonPropertyDescription("Indicates the minimum duration to retain a message after it is published to the topic (Must be a valid https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.Duration.)")
+ private String messageRetentionDuration;
+
+ /**
+ * Policy constraining the set of Google Cloud Platform regions where messages published to the topic may be stored
+ */
+ @Nullable
+ @JsonProperty("messageStoragePolicy")
+ @JsonPropertyDescription("Policy constraining the set of Google Cloud Platform regions where messages published to the topic may be stored")
+ private GooglePubSubChannelMessageStoragePolicy messageStoragePolicy;
+
+ /**
+ * Settings for validating messages published against a schema
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "schemaSettings", required = true)
+ @JsonPropertyDescription("Settings for validating messages published against a schema")
+ private GooglePubSubChannelSchemaSettings schemaSettings = new GooglePubSubChannelSchemaSettings();
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelMessageStoragePolicy.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelMessageStoragePolicy.java
new file mode 100644
index 00000000..2f236cc6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelMessageStoragePolicy.java
@@ -0,0 +1,36 @@
+package com.asyncapi.v3.binding.channel.googlepubsub;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes Google Cloud Pub/Sub MessageStoragePolicy.
+ *
+ * The Message Storage Policy Object is used to describe the Google Cloud Pub/Sub MessageStoragePolicy Object with AsyncAPI.
+ *
+ * @version 0.1.0
+ * @see Google Cloud Pub/Sub channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describe the Google Cloud Pub/Sub MessageStoragePolicy")
+public class GooglePubSubChannelMessageStoragePolicy {
+
+ /**
+ * A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage
+ */
+ @Nullable
+ @JsonProperty("allowedPersistenceRegions")
+ @JsonPropertyDescription("A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage")
+ private List allowedPersistenceRegions;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelSchemaSettings.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelSchemaSettings.java
new file mode 100644
index 00000000..ce5f807e
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/googlepubsub/GooglePubSubChannelSchemaSettings.java
@@ -0,0 +1,59 @@
+package com.asyncapi.v3.binding.channel.googlepubsub;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Google Cloud Pub/Sub SchemaSettings.
+ *
+ * The Schema Settings Object is used to describe the Google Cloud Pub/Sub SchemaSettings Object with AsyncAPI.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describe the Google Cloud Pub/Sub SchemaSettings")
+public class GooglePubSubChannelSchemaSettings {
+
+ /**
+ * The encoding of the message (Must be one of the possible Encoding values.)
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "encoding", required = true)
+ @JsonPropertyDescription("The encoding of the message (Must be one of the possible https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.topics#encoding values.)")
+ private String encoding = "";
+
+ /**
+ * The minimum (inclusive) revision allowed for validating messages
+ */
+ @Nullable
+ @JsonProperty("firstRevisionId")
+ @JsonPropertyDescription("The minimum (inclusive) revision allowed for validating messages")
+ private String firstRevisionId;
+
+ /**
+ * The maximum (inclusive) revision allowed for validating messages
+ */
+ @Nullable
+ @JsonProperty("lastRevisionId")
+ @JsonPropertyDescription("The maximum (inclusive) revision allowed for validating messages")
+ private String lastRevisionId;
+
+ /**
+ * The name of the schema that messages published should be validated against (The format is projects/{project}/schemas/{schema}.)
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "name", required = true)
+ @JsonPropertyDescription("The name of the schema that messages published should be validated against (The format is projects/{project}/schemas/{schema}.)")
+ private String name = "";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/http/HTTPChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/http/HTTPChannelBinding.java
new file mode 100644
index 00000000..3419cdc2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/http/HTTPChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.http;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * This object contains information about the channel representation in IBM MQ. Each channel corresponds to a Queue or Topic within IBM MQ.
+ *
+ * @version 0.1.0
+ * @see IBM MQ channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes IBM MQ channel binding.")
+public class IBMMQChannelBinding extends ChannelBinding {
+
+ /**
+ * Defines the type of AsyncAPI channel.
+ *
+ * MUST be either topic or queue. For type topic, the AsyncAPI channel name MUST be assumed for the IBM MQ topic string unless overridden.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "destinationType", defaultValue = "topic")
+ @JsonPropertyDescription("Defines the type of AsyncAPI channel.")
+ private IBMMQChannelDestinationType destinationType = IBMMQChannelDestinationType.TOPIC;
+
+ /**
+ * REQUIRED if destinationType = queue
+ *
+ * queue and topic fields MUST NOT coexist within a channel binding
+ */
+ @Nullable
+ @JsonProperty("queue")
+ @JsonPropertyDescription("Defines the properties of a queue.")
+ private IBMMQChannelQueueProperties queue;
+
+ /**
+ * Defines the properties of a topic.
+ *
+ * OPTIONAL if destinationType = topic
+ *
+ * queue and topic fields MUST NOT coexist within a channel binding.
+ */
+ @Nullable
+ @JsonProperty("topic")
+ @JsonPropertyDescription("Defines the properties of a topic.")
+ private IBMMQChannelTopicProperties topic;
+
+ /**
+ * The maximum length of the physical message (in bytes) accepted by the Topic or Queue. Messages produced that are
+ * greater in size than this value may fail to be delivered. More information on the maximum message length can be
+ * found on this page in the IBM MQ Knowledge Center.
+ *
+ * MUST be 0-104,857,600 bytes (100 MB).
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "Maximum length of the physical message (in bytes) must be greater or equals to 0"
+ )
+ @javax.validation.constraints.Max(
+ value = 104857600,
+ message = "Maximum length of the physical message (in bytes) must be lower or equals to 104857600"
+ )
+ @JsonProperty("maxMsgLength")
+ @JsonPropertyDescription("The maximum length of the physical message (in bytes) accepted by the Topic or Queue. Messages produced that are greater in size than this value may fail to be delivered. More information on the maximum message length can be found on this [page](https://www.ibm.com/support/knowledgecenter/SSFKSJ_latest/com.ibm.mq.ref.dev.doc/q097520_.html) in the IBM MQ Knowledge Center.")
+ private Integer maxMsgLength;
+
+ /**
+ * The version of this binding.
+ */
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelDestinationType.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelDestinationType.java
new file mode 100644
index 00000000..13609498
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelDestinationType.java
@@ -0,0 +1,20 @@
+package com.asyncapi.v3.binding.channel.ibmmq;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes IBM MQ channel destination type.
+ *
+ * @version 0.1.0
+ * @see IBM MQ channel binding
+ * @author Pavel Bodiachevskii
+ */
+public enum IBMMQChannelDestinationType {
+
+ @JsonProperty("topic")
+ TOPIC,
+
+ @JsonProperty("queue")
+ QUEUE
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelQueueProperties.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelQueueProperties.java
new file mode 100644
index 00000000..4c4586ab
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelQueueProperties.java
@@ -0,0 +1,62 @@
+package com.asyncapi.v3.binding.channel.ibmmq;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes IBM MQ channel queue properties.
+ *
+ * @version 0.1.0
+ * @see IBM MQ channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describes IBM MQ channel queue properties.")
+public class IBMMQChannelQueueProperties {
+
+ /**
+ * Defines the name of the IBM MQ queue associated with the channel.
+ *
+ * A value MUST be specified. MUST NOT exceed 48 characters in length. MUST be a valid IBM MQ queue name
+ */
+ @NotNull
+ @javax.validation.constraints.NotNull
+ @javax.validation.constraints.Size(
+ max = 48,
+ message = "Name of the IBM MQ queue must be less or equals to 48"
+ )
+ @Builder.Default
+ @JsonProperty("objectName")
+ @JsonPropertyDescription("Defines the name of the IBM MQ queue associated with the channel.")
+ private String objectName = "";
+
+ /**
+ * Defines if the queue is a cluster queue and therefore partitioned. If true, a binding option MAY be specified
+ * when accessing the queue. More information on binding options can be found on this page in the IBM MQ Knowledge Center.
+ *
+ * If false, binding options SHOULD NOT be specified when accessing the queue.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "isPartitioned", defaultValue = "false")
+ @JsonPropertyDescription("Defines if the queue is a cluster queue and therefore partitioned. If 'true', a binding option MAY be specified when accessing the queue. More information on binding options can be found on this page in the IBM MQ Knowledge Center.")
+ private Boolean isPartitioned = false;
+
+ /**
+ * Specifies if it is recommended to open the queue exclusively.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "exclusive", defaultValue = "false")
+ @JsonPropertyDescription("Specifies if it is recommended to open the queue exclusively.")
+ private Boolean exclusive = false;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelTopicProperties.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelTopicProperties.java
new file mode 100644
index 00000000..7fe8544e
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ibmmq/IBMMQChannelTopicProperties.java
@@ -0,0 +1,74 @@
+package com.asyncapi.v3.binding.channel.ibmmq;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes IBM MQ channel topic properties.
+ *
+ * @version 0.1.0
+ * @see IBM MQ channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+public class IBMMQChannelTopicProperties {
+
+ /**
+ * The value of the IBM MQ topic string to be used.
+ *
+ * MUST NOT exceed 10240 characters in length. MAY coexist with topic.objectName
+ */
+ @Nullable
+ @javax.validation.constraints.Max(
+ value = 10240,
+ message = "Maximum length of topic string must be lower or equals to 10240"
+ )
+ @JsonProperty("string")
+ @JsonPropertyDescription("The value of the IBM MQ topic string to be used.")
+ private String string;
+
+ /**
+ * The name of the IBM MQ topic object.
+ *
+ * MUST NOT exceed 48 characters in length. MAY coexist with topic.string
+ */
+ @Nullable
+ @javax.validation.constraints.Max(
+ value = 48,
+ message = "Maximum length of topic name must be lower or equals to 48"
+ )
+ @JsonProperty("objectName")
+ @JsonPropertyDescription("The name of the IBM MQ topic object.")
+ private String objectName;
+
+ /**
+ * Defines if the subscription may be durable.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "durablePermitted", defaultValue = "true")
+ @JsonPropertyDescription("Defines if the subscription may be durable.")
+ private Boolean durablePermitted = true;
+
+ /**
+ * Defines if the last message published will be made available to new subscriptions.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "lastMsgRetained", defaultValue = "false")
+ @JsonPropertyDescription("Defines if the last message published will be made available to new subscriptions.")
+ private Boolean lastMsgRetained = false;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/jms/JMSChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/jms/JMSChannelBinding.java
new file mode 100644
index 00000000..3d74dac6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/jms/JMSChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.jms;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes JMS channel binding.
+ *
+ * @version 0.1.0
+ * @see JMS channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class JMSChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelBinding.java
new file mode 100644
index 00000000..66b61ea5
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelBinding.java
@@ -0,0 +1,76 @@
+package com.asyncapi.v3.binding.channel.kafka;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Kafka channel binding.
+ *
+ * @version 0.4.0
+ * @see Kafka channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Kafka channel binding.")
+public class KafkaChannelBinding extends ChannelBinding {
+
+ /**
+ * Kafka topic name if different from channel name.
+ */
+ @Nullable
+ @JsonProperty("topic")
+ @JsonPropertyDescription("Kafka topic name if different from channel name.")
+ private String topic;
+
+ /**
+ * Number of partitions configured on this topic (useful to know how many parallel consumers you may run).
+ *
+ * MUST be positive.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 1,
+ message = "Number of partitions must be greater or equals to 1"
+ )
+ @JsonProperty("partitions")
+ @JsonPropertyDescription("Number of partitions configured on this topic (useful to know how many parallel consumers you may run).")
+ private Integer partitions;
+
+ /**
+ * Number of replicas configured on this topic.
+ *
+ * MUST be positive.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 1,
+ message = "Number of replicas must be greater or equals to 1"
+ )
+ @JsonProperty("replicas")
+ @JsonPropertyDescription("Number of replicas configured on this topic.")
+ private Integer replicas;
+
+ /**
+ * Topic configuration properties that are relevant for the API.
+ */
+ @Nullable
+ @JsonProperty("topicConfiguration")
+ @JsonPropertyDescription("Topic configuration properties that are relevant for the API.")
+ private KafkaChannelTopicConfiguration topicConfiguration;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ private String bindingVersion = "0.4.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicCleanupPolicy.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicCleanupPolicy.java
new file mode 100644
index 00000000..a58e764a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicCleanupPolicy.java
@@ -0,0 +1,13 @@
+package com.asyncapi.v3.binding.channel.kafka;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum KafkaChannelTopicCleanupPolicy {
+
+ @JsonProperty("compact")
+ COMPACT,
+
+ @JsonProperty("delete")
+ DELETE
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicConfiguration.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicConfiguration.java
new file mode 100644
index 00000000..63ed484c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/kafka/KafkaChannelTopicConfiguration.java
@@ -0,0 +1,83 @@
+package com.asyncapi.v3.binding.channel.kafka;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * This objects contains information about the API relevant topic configuration in Kafka.
+ *
+ * @version 0.4.0
+ * @see Kafka channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class KafkaChannelTopicConfiguration {
+
+ /**
+ * The cleanup.policy configuration option.
+ *
+ * array may only contain delete and/or compact
+ */
+ @Nullable
+ @JsonProperty("cleanup.policy")
+ private List cleanupPolicy;
+
+ /**
+ * The retention.ms configuration option.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = -1,
+ message = "retention.ms must be greater or equals to -1"
+ )
+ @JsonProperty("retention.ms")
+ @JsonPropertyDescription("The [`retention.ms`](https://kafka.apache.org/documentation/#topicconfigs_retention.ms) configuration option.")
+ private Integer retentionMs;
+
+ /**
+ * The retention.bytes configuration option.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = -1,
+ message = "retention.bytes must be greater or equals to -1"
+ )
+ @JsonProperty("retention.bytes")
+ @JsonPropertyDescription("The [`retention.bytes`](https://kafka.apache.org/documentation/#topicconfigs_retention.bytes) configuration option.")
+ private Integer retentionBytes;
+
+ /**
+ * The delete.retention.ms configuration option.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "delete.retention.ms must be greater or equals to 0"
+ )
+ @JsonProperty("delete.retention.ms")
+ @JsonPropertyDescription("The [`delete.retention.ms`](https://kafka.apache.org/documentation/#topicconfigs_delete.retention.ms) configuration option.")
+ private Integer deleteRetentionMs;
+
+ /**
+ * The max.message.bytes configuration option.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "max.message.bytes must be greater or equals to 0"
+ )
+ @JsonProperty("max.message.bytes")
+ @JsonPropertyDescription("The [`max.message.bytes`](https://kafka.apache.org/documentation/#topicconfigs_max.message.bytes) configuration option.")
+ private Integer maxMessageBytes;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mercure/MercureChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mercure/MercureChannelBinding.java
new file mode 100644
index 00000000..8cdb274b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mercure/MercureChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.mercure;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Mercure channel binding.
+ *
+ * @version 0.1.0
+ * @see Mercure channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MercureChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt/MQTTChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt/MQTTChannelBinding.java
new file mode 100644
index 00000000..8f1ad80b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt/MQTTChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.mqtt;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes MQTT channel binding.
+ *
+ * @version 0.1.0
+ * @see MQTT channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTTChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt5/MQTT5ChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt5/MQTT5ChannelBinding.java
new file mode 100644
index 00000000..6386770b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/mqtt5/MQTT5ChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.mqtt5;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes MQTT 5 channel binding.
+ *
+ * @version 0.2.0
+ * @see MQTT 5 channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTT5ChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/nats/NATSChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/nats/NATSChannelBinding.java
new file mode 100644
index 00000000..c069aabe
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/nats/NATSChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.nats;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes NATS channel binding.
+ *
+ * @version 0.1.0
+ * @see NATS channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class NATSChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelBinding.java
new file mode 100644
index 00000000..df114f94
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelBinding.java
@@ -0,0 +1,101 @@
+package com.asyncapi.v3.binding.channel.pulsar;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes Pulsar channel binding.
+ *
+ * @version 0.1.0
+ * @see Pulsar channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Pulsar channel binding.")
+public class PulsarChannelBinding extends ChannelBinding {
+
+ /**
+ * The namespace the channel is associated with.
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty("namespace")
+ @JsonPropertyDescription("The namespace the channel is associated with.")
+ private String namespace = "";
+
+ /**
+ * Persistence of the topic in Pulsar. It MUST be either persistent or non-persistent.
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "persistence", defaultValue = "persistent")
+ @JsonPropertyDescription("Persistence of the topic in Pulsar. It MUST be either persistent or non-persistent.")
+ private PulsarChannelPersistence persistence = PulsarChannelPersistence.PERSISTENT;
+
+ /**
+ * Topic compaction threshold given in Megabytes.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "Topic compaction threshold must be greater or equals to 0."
+ )
+ @JsonProperty("compaction")
+ @JsonPropertyDescription("Topic compaction threshold given in Megabytes.")
+ private Integer compaction;
+
+ /**
+ * A list of clusters the topic is replicated to.
+ */
+ @Nullable
+ @JsonProperty("geo-replication")
+ @JsonPropertyDescription("A list of clusters the topic is replicated to.")
+ private List geoReplication;
+
+ /**
+ * Topic retention policy.
+ */
+ @Nullable
+ @JsonProperty("retention")
+ @JsonPropertyDescription("Topic retention policy.")
+ private PulsarChannelRetentionDefinition retention;
+
+ /**
+ * Message time-to-live in seconds.
+ */
+ @Nullable
+ @JsonProperty("ttl")
+ @JsonPropertyDescription("Message time-to-live in seconds.")
+ private Integer ttl;
+
+ /**
+ * Message deduplication. When true, it ensures that each message produced on Pulsar topics is persisted to disk only once.
+ */
+ @Nullable
+ @JsonProperty("deduplication")
+ @JsonPropertyDescription("Message deduplication. When true, it ensures that each message produced on Pulsar topics is persisted to disk only once.")
+ private Boolean deduplication;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelPersistence.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelPersistence.java
new file mode 100644
index 00000000..8af581a8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelPersistence.java
@@ -0,0 +1,22 @@
+package com.asyncapi.v3.binding.channel.pulsar;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes Pulsar channel persistence.
+ *
+ * @version 0.1.0
+ * @see Pulsar channel binding
+ * @author Pavel Bodiachevskii
+ */
+@JsonClassDescription("Describes Pulsar channel persistence.")
+public enum PulsarChannelPersistence {
+
+ @JsonProperty("persistent")
+ PERSISTENT,
+
+ @JsonProperty("non-persistent")
+ NON_PERSISTENT
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelRetentionDefinition.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelRetentionDefinition.java
new file mode 100644
index 00000000..badd4b15
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/pulsar/PulsarChannelRetentionDefinition.java
@@ -0,0 +1,44 @@
+package com.asyncapi.v3.binding.channel.pulsar;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Pulsar channel retention definition.
+ *
+ * The Retention Definition Object is used to describe the Pulsar Retention policy.
+ *
+ * @version 0.1.0
+ * @see Pulsar channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describes Pulsar channel retention definition.")
+public class PulsarChannelRetentionDefinition {
+
+ /**
+ * Time given in Minutes.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("time")
+ @JsonPropertyDescription("Time given in Minutes.")
+ private Integer time = 0;
+
+ /**
+ * Size given in MegaBytes.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("size")
+ @JsonPropertyDescription("Size given in MegaBytes.")
+ private Integer size = 0;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/redis/RedisChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/redis/RedisChannelBinding.java
new file mode 100644
index 00000000..a061a679
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/redis/RedisChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.redis;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Redis channel binding.
+ *
+ * @version 0.1.0
+ * @see Redis channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class RedisChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sns/SNSChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sns/SNSChannelBinding.java
new file mode 100644
index 00000000..f2e8b833
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sns/SNSChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.sns;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SNS channel binding.
+ *
+ * @version 0.1.0
+ * @see SNS channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SNSChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/solace/SolaceChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/solace/SolaceChannelBinding.java
new file mode 100644
index 00000000..cbd31a55
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/solace/SolaceChannelBinding.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3.binding.channel.solace;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Solace channel binding.
+ *
+ * @version 0.3.0
+ * @see Solace channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sqs/SQSChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sqs/SQSChannelBinding.java
new file mode 100644
index 00000000..961a8ad6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/sqs/SQSChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.sqs;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SQS channel binding.
+ *
+ * @version 0.1.0
+ * @see SQS channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SQSChannelBinding extends ChannelBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/stomp/STOMPChannelBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/stomp/STOMPChannelBinding.java
new file mode 100644
index 00000000..f4b13a98
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/stomp/STOMPChannelBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.channel.stomp;
+
+import com.asyncapi.v3.binding.channel.ChannelBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * When using WebSockets, the channel represents the connection. Unlike other protocols that support multiple virtual
+ * channels (topics, routing keys, etc.) per connection, WebSockets doesn't support virtual channels or, put it another
+ * way, there's only one channel and its characteristics are strongly related to the protocol used for the handshake,
+ * i.e., HTTP.
+ *
+ * @version 0.1.0
+ * @see WebSockets channel binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes WebSockets channel binding.")
+public class WebSocketsChannelBinding extends ChannelBinding {
+
+ /**
+ * The HTTP method to use when establishing the connection. Its value MUST be either GET or POST.
+ */
+ @Nullable
+ @JsonProperty("method")
+ @JsonPropertyDescription("The HTTP method to use when establishing the connection. Its value MUST be either GET or POST.")
+ private WebSocketsChannelMethod method;
+
+ /**
+ * A Schema object containing the definitions for each query parameter. This schema MUST be of type
+ * object and have a properties key.
+ */
+ @Nullable
+ @JsonProperty("query")
+ @JsonPropertyDescription("A Schema object containing the definitions for each query parameter. This schema MUST be of type object and have a properties key.")
+ private Schema query;
+
+ /**
+ * A Schema object containing the definitions of the HTTP headers to use when establishing the connection.
+ * This schema MUST be of type object and have a properties key.
+ */
+ @Nullable
+ @JsonProperty("headers")
+ @JsonPropertyDescription("A Schema object containing the definitions of the HTTP headers to use when establishing the connection. This schema MUST be of type object and have a properties key.")
+ private Schema headers;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ws/WebSocketsChannelMethod.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ws/WebSocketsChannelMethod.java
new file mode 100644
index 00000000..48362411
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/channel/ws/WebSocketsChannelMethod.java
@@ -0,0 +1,13 @@
+package com.asyncapi.v3.binding.channel.ws;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public enum WebSocketsChannelMethod {
+
+ @JsonProperty("GET")
+ GET,
+
+ @JsonProperty("POST")
+ POST
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/MessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/MessageBinding.java
new file mode 100644
index 00000000..2f75d7d8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/MessageBinding.java
@@ -0,0 +1,13 @@
+package com.asyncapi.v3.binding.message;
+
+import com.asyncapi.v3.ExtendableObject;
+import lombok.EqualsAndHashCode;
+
+/**
+ * Describes AsyncAPI message binding.
+ *
+ * @author Pavel Bodiachevskii
+ */
+@EqualsAndHashCode(callSuper = true)
+public class MessageBinding extends ExtendableObject {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp/AMQPMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp/AMQPMessageBinding.java
new file mode 100644
index 00000000..820202c6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp/AMQPMessageBinding.java
@@ -0,0 +1,52 @@
+package com.asyncapi.v3.binding.message.amqp;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes AMQP 0-9-1 message binding.
+ *
+ * Contains information about the message representation in AMQP.
+ *
+ * @version 0.2.0
+ * @see AMQP message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes AMQP 0-9-1 message binding.")
+public class AMQPMessageBinding extends MessageBinding {
+
+ /**
+ * A MIME encoding for the message content.
+ */
+ @Nullable
+ @JsonProperty("contentEncoding")
+ @JsonPropertyDescription("A MIME encoding for the message content.")
+ private String contentEncoding;
+
+ /**
+ * Application-specific message type.
+ */
+ @Nullable
+ @JsonProperty("messageType")
+ @JsonPropertyDescription("Application-specific message type.")
+ private String messageType;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.2.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp1/AMQP1MessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp1/AMQP1MessageBinding.java
new file mode 100644
index 00000000..73617ca1
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/amqp1/AMQP1MessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.amqp1;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes AMQP 1.0 message binding.
+ *
+ * @version 0.1.0
+ * @see AMQP message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AMQP1MessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/anypointmq/AnypointMQMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/anypointmq/AnypointMQMessageBinding.java
new file mode 100644
index 00000000..07f8b497
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/anypointmq/AnypointMQMessageBinding.java
@@ -0,0 +1,45 @@
+package com.asyncapi.v3.binding.message.anypointmq;
+
+import com.asyncapi.v3.schema.Schema;
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Anypoint MQ message binding.
+ *
+ * @version 0.0.1
+ * @see Anypoint MQ message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Anypoint MQ message binding.")
+public class AnypointMQMessageBinding extends MessageBinding {
+
+ /**
+ * A Schema object containing the definitions for Anypoint MQ-specific headers (so-called protocol headers).
+ * This schema MUST be of type object and have a properties key. Examples of Anypoint MQ protocol headers are
+ * messageId and messageGroupId.
+ */
+ @Nullable
+ @JsonProperty("headers")
+ @JsonPropertyDescription("A Schema object containing the definitions for Anypoint MQ-specific headers (so-called protocol headers). This schema MUST be of type object and have a properties key. Examples of Anypoint MQ protocol headers are messageId and messageGroupId.")
+ private Schema headers;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.0.1";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageBinding.java
new file mode 100644
index 00000000..5f6373de
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageBinding.java
@@ -0,0 +1,62 @@
+package com.asyncapi.v3.binding.message.googlepubsub;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Google Cloud Pub/Sub message binding.
+ *
+ * The Message Binding Object is used to describe the Google Cloud Pub/Sub specific PubsubMessage details, alongside with
+ * pertintent parts of the Google Cloud Pub/Sub Schema Object, with AsyncAPI.
+ *
+ * @version 0.1.0
+ * @see Google Cloud Pub/Sub message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Google Cloud Pub/Sub message binding.")
+public class GooglePubSubMessageBinding extends MessageBinding {
+
+ /**
+ * If non-empty, identifies related messages for which publish order should be respected (For more information, see ordering messages.)
+ */
+ @Nullable
+ @JsonProperty("orderingKey")
+ @JsonPropertyDescription("If non-empty, identifies related messages for which publish order should be respected (For more information, see https://cloud.google.com/pubsub/docs/ordering messages")
+ private String orderingKey;
+
+ /**
+ * Attributes for this message (If this field is empty, the message must contain non-empty data. This can be used to
+ * filter messages on the subscription.)
+ */
+ @Nullable
+ @JsonProperty("attributes")
+ @JsonPropertyDescription("Attributes for this message (If this field is empty, the message must contain non-empty data. This can be used to filter messages on the subscription.)")
+ private Object attributes;
+
+ /**
+ * Describes the schema used to validate the payload of this message
+ */
+ @Nullable
+ @JsonProperty("schema")
+ @JsonPropertyDescription("Describes the schema used to validate the payload of this message")
+ private GooglePubSubMessageSchemaDefinition schema;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinition.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinition.java
new file mode 100644
index 00000000..277061b3
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinition.java
@@ -0,0 +1,49 @@
+package com.asyncapi.v3.binding.message.googlepubsub;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Describes Google Cloud Pub/Sub message schema definition.
+ *
+ * The Schema Definition Object is used to describe the Google Cloud Pub/Sub Schema Object with AsyncAPI.
+ * While some of this information could be, or is, described using native AsyncAPI, for consistency it makes sense to
+ * provide this information here at all times, especially for cases where AsyncAPI does not natively support describing
+ * payloads using a supported Google Cloud Pub/Sub schema format like Protobuf.
+ *
+ * @version 0.1.0
+ * @see Google Cloud Pub/Sub message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+@JsonClassDescription("Describes Google Cloud Pub/Sub message schema definition.")
+public class GooglePubSubMessageSchemaDefinition {
+
+ /**
+ * The name of the schema
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "name", required = true)
+ @JsonPropertyDescription("The name of the schema")
+ private String name = "";
+
+ /**
+ * The type of the schema
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "type", required = true)
+ @JsonPropertyDescription("The type of the schema")
+ private GooglePubSubMessageSchemaDefinitionType type = GooglePubSubMessageSchemaDefinitionType.PROTOBUF;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinitionType.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinitionType.java
new file mode 100644
index 00000000..f7dd4bc3
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/googlepubsub/GooglePubSubMessageSchemaDefinitionType.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3.binding.message.googlepubsub;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes Google Cloud Pub/Sub message schema definition type.
+ *
+ * @version 0.1.0
+ * @see Google Cloud Pub/Sub message binding
+ * @see Types of schemas
+ * @author Pavel Bodiachevskii
+ */
+@JsonClassDescription("Describes Google Cloud Pub/Sub message schema definition type.")
+public enum GooglePubSubMessageSchemaDefinitionType {
+
+ @JsonProperty("avro")
+ AVRO,
+
+ @JsonProperty("protobuf")
+ PROTOBUF
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/http/HTTPMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/http/HTTPMessageBinding.java
new file mode 100644
index 00000000..664f1e40
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/http/HTTPMessageBinding.java
@@ -0,0 +1,44 @@
+package com.asyncapi.v3.binding.message.http;
+
+import com.asyncapi.v3.schema.Schema;
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes HTTP message binding.
+ *
+ * Contains information about the message representation in HTTP.
+ *
+ * @version 0.1.0
+ * @see HTTP message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class HTTPMessageBinding extends MessageBinding {
+
+ /**
+ * A Schema object containing the definitions for each query parameter. This schema MUST be of type object
+ * and have a properties key.*
+ */
+ @Nullable
+ @JsonProperty("headers")
+ @JsonPropertyDescription("A Schema object containing the definitions for each query parameter. This schema MUST be of type object and have a properties key.")
+ private Schema headers;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageBinding.java
new file mode 100644
index 00000000..72efcf1a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageBinding.java
@@ -0,0 +1,89 @@
+package com.asyncapi.v3.binding.message.ibmmq;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes IBM MQ message binding.
+ *
+ * This object contains information about the message representation in IBM MQ.
+ *
+ * @version 0.1.0
+ * @see IBM MQ message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes IBM MQ message binding.")
+public class IBMMQMessageBinding extends MessageBinding {
+
+ /**
+ * The type of the message.
+ *
+ * MUST be either string, jms or binary
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "type", defaultValue = "string")
+ @JsonPropertyDescription("The type of the message.")
+ private IBMMQMessageType type = IBMMQMessageType.STRING;
+
+ /**
+ * Defines the IBM MQ message headers to include with this message. More than one header can be specified as a comma
+ * separated list. Supporting information on IBM MQ message formats can be found on this page in the IBM MQ Knowledge Center.
+ *
+ * OPTIONAL if type = binary
+ *
+ * headers MUST NOT be specified if type = string or jms
+ */
+ @Nullable
+ @JsonProperty("headers")
+ @JsonPropertyDescription("Defines the IBM MQ message headers to include with this message. More than one header can be specified as a comma separated list.")
+ private String headers;
+
+ /**
+ * Provides additional information for application developers: describes the message type or format.
+ *
+ * The description field of the IBM MQ message binding object MAY include CommonMark markdown formatting.
+ * A minimum markdown syntax as described by CommonMark 0.27 is assumed.
+ */
+ @Nullable
+ @JsonProperty("description")
+ @JsonPropertyDescription("Provides additional information for application developers: describes the message type or format.")
+ private String description;
+
+ /**
+ * The recommended setting the client should use for the TTL (Time-To-Live) of the message.
+ * This is a period of time expressed in milliseconds and set by the application that puts the message.
+ * expiry values are API dependant e.g., MQI and JMS use different units of time and default values for unlimited.
+ * General information on IBM MQ message expiry can be found on this page in the IBM MQ Knowledge Center.
+ *
+ * expiry value MUST be either zero (unlimited) or greater than zero.
+ */
+ @Nullable
+ @Builder.Default
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "Expiry must be greater or equals to 0"
+ )
+ @JsonProperty(value = "expiry", defaultValue = "0")
+ @JsonPropertyDescription("The recommended setting the client should use for the TTL (Time-To-Live) of the message. This is a period of time expressed in milliseconds and set by the application that puts the message. 'expiry' values are API dependant e.g., MQI and JMS use different units of time and default values for 'unlimited'. General information on IBM MQ message expiry can be found on this [page](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=mqmd-expiry-mqlong) in the IBM MQ Knowledge Center.")
+ private Integer expiry = 0;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageType.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageType.java
new file mode 100644
index 00000000..171f8a2f
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ibmmq/IBMMQMessageType.java
@@ -0,0 +1,25 @@
+package com.asyncapi.v3.binding.message.ibmmq;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes IBM MQ message type.
+ *
+ * This object contains information about the message type in IBM MQ.
+ *
+ * @version 0.1.0
+ * @see IBM MQ message binding
+ * @author Pavel Bodiachevskii
+ */
+public enum IBMMQMessageType {
+
+ @JsonProperty("string")
+ STRING,
+
+ @JsonProperty("jms")
+ JMS,
+
+ @JsonProperty("binary")
+ BINARY
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/jms/JMSMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/jms/JMSMessageBinding.java
new file mode 100644
index 00000000..f44eec50
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/jms/JMSMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.jms;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the message representation in Kafka.
+ *
+ * @version 0.1.0
+ * @see Kafka message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class KafkaMessageBinding extends MessageBinding {
+
+ /**
+ * The message key.
+ */
+ @Nullable
+ @JsonProperty("key")
+ @JsonPropertyDescription("The message key.")
+ private Schema key;
+
+ /**
+ * If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. header or payload).
+ */
+ @Nullable
+ @JsonProperty("schemaIdLocation")
+ @JsonPropertyDescription("If a Schema Registry is used when performing this operation, tells where the id of schema is stored (e.g. header or payload).")
+ private KafkaMessageSchemaIdLocation schemaIdLocation;
+
+ /**
+ * Number of bytes or vendor specific values when schema id is encoded in payload (e.g confluent/ apicurio-legacy / apicurio-new).
+ */
+ @Nullable
+ @JsonProperty("schemaIdPayloadEncoding")
+ @JsonPropertyDescription("Number of bytes or vendor specific values when schema id is encoded in payload (e.g confluent/ apicurio-legacy / apicurio-new).")
+ private String schemaIdPayloadEncoding;
+
+ /**
+ * Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.
+ */
+ @Nullable
+ @JsonProperty("schemaLookupStrategy")
+ @JsonPropertyDescription("Freeform string for any naming strategy class to use. Clients should default to the vendor default if not supplied.")
+ private String schemaLookupStrategy;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.4.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/kafka/KafkaMessageSchemaIdLocation.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/kafka/KafkaMessageSchemaIdLocation.java
new file mode 100644
index 00000000..e0a16f88
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/kafka/KafkaMessageSchemaIdLocation.java
@@ -0,0 +1,20 @@
+package com.asyncapi.v3.binding.message.kafka;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Describes Kafka message schema id location.
+ *
+ * @version 0.1.0
+ * @see Kafka message binding
+ * @author Pavel Bodiachevskii
+ */
+public enum KafkaMessageSchemaIdLocation {
+
+ @JsonProperty("header")
+ HEADER,
+
+ @JsonProperty("payload")
+ PAYLOAD
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mercure/MercureMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mercure/MercureMessageBinding.java
new file mode 100644
index 00000000..aa3ead1c
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mercure/MercureMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.mercure;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the message representation in MQTT.
+ *
+ * @version 0.1.0
+ * @see MQTT message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTTMessageBinding extends MessageBinding {
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mqtt5/MQTT5MessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mqtt5/MQTT5MessageBinding.java
new file mode 100644
index 00000000..e344426e
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/mqtt5/MQTT5MessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.mqtt5;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes MQTT 5 message binding.
+ *
+ * @version 0.2.0
+ * @see MQTT 5 message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTT5MessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/nats/NATSMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/nats/NATSMessageBinding.java
new file mode 100644
index 00000000..8557fc15
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/nats/NATSMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.nats;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * This object MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * @version 0.1.0
+ * @see Pulsar message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class PulsarMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/redis/RedisMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/redis/RedisMessageBinding.java
new file mode 100644
index 00000000..37b5980a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/redis/RedisMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.redis;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Redis message binding.
+ *
+ * @version 0.1.0
+ * @see Redis message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class RedisMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sns/SNSMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sns/SNSMessageBinding.java
new file mode 100644
index 00000000..17a72455
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sns/SNSMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.sns;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SNS message binding.
+ *
+ * @version 0.1.0
+ * @see SNS message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SNSMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/solace/SolaceMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/solace/SolaceMessageBinding.java
new file mode 100644
index 00000000..29b24c2b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/solace/SolaceMessageBinding.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3.binding.message.solace;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Solace message binding.
+ *
+ * @version 0.3.0
+ * @see Solace message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SolaceMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sqs/SQSMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sqs/SQSMessageBinding.java
new file mode 100644
index 00000000..9defa798
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/sqs/SQSMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.sqs;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SQS message binding.
+ *
+ * @version 0.1.0
+ * @see SQS message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SQSMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/stomp/STOMPMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/stomp/STOMPMessageBinding.java
new file mode 100644
index 00000000..3e786247
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/stomp/STOMPMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.stomp;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes STOMP message binding.
+ *
+ * @version 0.1.0
+ * @see STOMP message binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class STOMPMessageBinding extends MessageBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ws/WebSocketsMessageBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ws/WebSocketsMessageBinding.java
new file mode 100644
index 00000000..24dd7274
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/message/ws/WebSocketsMessageBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.message.ws;
+
+import com.asyncapi.v3.binding.message.MessageBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the operation representation in AMQP.
+ *
+ * @version 0.2.0
+ * @see AMQP operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes AMQP 0-9-1 operation binding.")
+public class AMQPOperationBinding extends OperationBinding {
+
+ /**
+ * TTL (Time-To-Live) for the message. It MUST be greater than or equal to zero.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "TTL (Time-To-Live) for the message must be greater than or equal to zero"
+ )
+ @JsonProperty("expiration")
+ @JsonPropertyDescription("TTL (Time-To-Live) for the message. It MUST be greater than or equal to zero.")
+ private Integer expiration;
+
+ /**
+ * Identifies the user who has sent the message.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("userId")
+ @JsonPropertyDescription("Identifies the user who has sent the message.")
+ private String userId;
+
+ /**
+ * The routing keys the message should be routed to at the time of publishing.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("cc")
+ @JsonPropertyDescription("The routing keys the message should be routed to at the time of publishing.")
+ private List cc;
+
+ /**
+ * A priority for the message.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("priority")
+ @JsonPropertyDescription("A priority for the message.")
+ private Integer priority;
+
+ /**
+ * Delivery mode of the message. Its value MUST be either 1 (transient) or 2 (persistent).
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 1,
+ message = "Delivery mode of the message must be either 1 (transient) or 2 (persistent)"
+ )
+ @javax.validation.constraints.Max(
+ value = 2,
+ message = "Delivery mode of the message must be either 1 (transient) or 2 (persistent)"
+ )
+ @JsonProperty("deliveryMode")
+ @JsonPropertyDescription("Delivery mode of the message. Its value MUST be either 1 (transient) or 2 (persistent).")
+ private Integer deliveryMode;
+
+ /**
+ * Whether the message is mandatory or not.
+ *
+ * Applies to: publish
+ */
+ @Nullable
+ @JsonProperty("mandatory")
+ @JsonPropertyDescription("Whether the message is mandatory or not.")
+ private Boolean mandatory;
+
+ /**
+ * Like {@link #cc} but consumers will not receive this information.
+ *
+ * Applies to: publish
+ */
+ @Nullable
+ @JsonProperty("bcc")
+ @JsonPropertyDescription("Like cc but consumers will not receive this information.")
+ private List bcc;
+
+ /**
+ * Name of the queue where the consumer should send the response.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("replyTo")
+ @JsonPropertyDescription("Name of the queue where the consumer should send the response.")
+ private String replyTo;
+
+ /**
+ * Whether the message should include a timestamp or not.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("timestamp")
+ @JsonPropertyDescription("Whether the message should include a timestamp or not.")
+ private Boolean timestamp;
+
+ /**
+ * Whether the consumer should ack the message or not.
+ *
+ * Applies to: subscribe
+ */
+ @Nullable
+ @JsonProperty("ack")
+ @JsonPropertyDescription("Whether the consumer should ack the message or not.")
+ private Boolean ack;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.2.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/amqp1/AMQP1OperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/amqp1/AMQP1OperationBinding.java
new file mode 100644
index 00000000..29a7ce02
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/amqp1/AMQP1OperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.amqp1;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes AMQP 1.0 operation binding.
+ *
+ * @version 0.1.0
+ * @see AMQP operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AMQP1OperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/anypointmq/AnypointMQOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/anypointmq/AnypointMQOperationBinding.java
new file mode 100644
index 00000000..8555af46
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/anypointmq/AnypointMQOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.anypointmq;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Anypoint MQ operation binding.
+ *
+ * @version 0.0.1
+ * @see Anypoint MQ operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class AnypointMQOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/googlepubsub/GooglePubSubOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/googlepubsub/GooglePubSubOperationBinding.java
new file mode 100644
index 00000000..7b074d70
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/googlepubsub/GooglePubSubOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.googlepubsub;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the operation representation in HTTP.
+ *
+ * @version 0.1.0
+ * @see HTTP operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class HTTPOperationBinding extends OperationBinding {
+
+ /**
+ * Required.
+ *
+ * Type of operation. Its value MUST be either request or response.
+ */
+ @NotNull
+ @Builder.Default
+ @javax.validation.constraints.NotNull
+ @JsonProperty(value = "type", required = true)
+ @JsonPropertyDescription("Type of operation. Its value MUST be either request or response.")
+ private HTTPOperationType type = HTTPOperationType.REQUEST;
+
+ /**
+ * When type is request, this is the HTTP method, otherwise it MUST be ignored. Its value MUST be one of
+ * GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, CONNECT, and TRACE.
+ */
+ @Nullable
+ @JsonProperty("method")
+ @JsonPropertyDescription("When type is request, this is the HTTP method, otherwise it MUST be ignored. Its value MUST be one of GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, CONNECT, and TRACE.")
+ private HTTPOperationMethod method;
+
+ /**
+ * A Schema object containing the definitions for each query parameter. This schema MUST be of type object
+ * and have a properties key.
+ */
+ @Nullable
+ @JsonProperty("query")
+ @JsonPropertyDescription("A Schema object containing the definitions for each query parameter. This schema MUST be of type object and have a properties key.")
+ private Schema query;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/http/HTTPOperationMethod.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/http/HTTPOperationMethod.java
new file mode 100644
index 00000000..d71ddf2a
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/http/HTTPOperationMethod.java
@@ -0,0 +1,22 @@
+package com.asyncapi.v3.binding.operation.http;
+
+/**
+ * Describes HTTP operation type.
+ *
+ * This object MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * @version 0.1.0
+ * @see IBM MQ operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class IBMMQOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/jms/JMSOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/jms/JMSOperationBinding.java
new file mode 100644
index 00000000..f3a1f1a8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/jms/JMSOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.jms;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the operation representation in Kafka.
+ *
+ * @version 0.1.0
+ * @see Kafka operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class KafkaOperationBinding extends OperationBinding {
+
+ /**
+ * Id of the consumer group.
+ */
+ @Nullable
+ @JsonProperty("groupId")
+ @JsonPropertyDescription("Id of the consumer group.")
+ private Schema groupId;
+
+ /**
+ * Id of the consumer inside a consumer group.
+ */
+ @Nullable
+ @JsonProperty("clientId")
+ @JsonPropertyDescription("Id of the consumer inside a consumer group.")
+ private Schema clientId;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ private String bindingVersion = "0.4.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mercure/MercureOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mercure/MercureOperationBinding.java
new file mode 100644
index 00000000..10dcaa96
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mercure/MercureOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.mercure;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the operation representation in MQTT.
+ *
+ * @version 0.1.0
+ * @see MQTT operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes MQTT operation binding.")
+public class MQTTOperationBinding extends OperationBinding {
+
+ /**
+ * Defines how hard the broker/client will try to ensure that a message is received.
+ * Its value MUST be either 0, 1 or 2.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "QoS must be greater or equals to 0."
+ )
+ @javax.validation.constraints.Max(
+ value = 2,
+ message = "QoS must be lower or equals to 0."
+ )
+ @JsonProperty("qos")
+ @JsonPropertyDescription("Defines the Quality of Service (QoS) levels for the message flow between client and server. Its value MUST be either 0 (At most once delivery), 1 (At least once delivery), or 2 (Exactly once delivery).")
+ private Integer qos;
+
+ /**
+ * Whether the broker should retain the message or not.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @JsonProperty("retain")
+ @JsonPropertyDescription("Whether the broker should retain the message or not.")
+ private Boolean retain;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ *
+ * Applies to: publish, subscribe
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mqtt5/MQTT5OperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mqtt5/MQTT5OperationBinding.java
new file mode 100644
index 00000000..2964aad6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/mqtt5/MQTT5OperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.mqtt5;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes MQTT 5 operation binding.
+ *
+ * @version 0.2.0
+ * @see MQTT 5 operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTT5OperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/nats/NATSOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/nats/NATSOperationBinding.java
new file mode 100644
index 00000000..9a6c2cf2
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/nats/NATSOperationBinding.java
@@ -0,0 +1,46 @@
+package com.asyncapi.v3.binding.operation.nats;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes NATS operation binding.
+ *
+ * @version 0.1.0
+ * @see NATS operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes NATS operation binding.")
+public class NATSOperationBinding extends OperationBinding {
+
+ /**
+ * Defines the name of the queue to use. It MUST NOT exceed 255 characters.
+ */
+ @Nullable
+ @javax.validation.constraints.Size(
+ max = 255,
+ message = "Queue name must be lower or equals to 255."
+ )
+ @JsonProperty("queue")
+ @JsonPropertyDescription("Defines the name of the queue to use. It MUST NOT exceed 255 characters.")
+ private String queue;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/pulsar/PulsarOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/pulsar/PulsarOperationBinding.java
new file mode 100644
index 00000000..3670d242
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/pulsar/PulsarOperationBinding.java
@@ -0,0 +1,23 @@
+package com.asyncapi.v3.binding.operation.pulsar;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Builder;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * Describes Pulsar operation binding.
+ *
+ * This object MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * @version 0.1.0
+ * @see Pulsar operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class PulsarOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/redis/RedisOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/redis/RedisOperationBinding.java
new file mode 100644
index 00000000..0c4eb8e0
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/redis/RedisOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.redis;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Redis operation binding.
+ *
+ * @version 0.1.0
+ * @see Redis operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class RedisOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sns/SNSOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sns/SNSOperationBinding.java
new file mode 100644
index 00000000..e0445fc8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sns/SNSOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.sns;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the operation representation in Solace PubSub+ Broker.
+ *
+ * @version 0.3.0
+ * @see Solace operation binding
+ * @author Dennis Brinley, Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Solace operation binding.")
+public class SolaceOperationBinding extends OperationBinding {
+
+ /**
+ * List of destinations
+ */
+ @Nullable
+ @JsonProperty("destinations")
+ @JsonPropertyDescription("List of destinations")
+ private List destinations;
+
+ /**
+ * The version of this binding. (e.g. bindingVersion: 0.3.0)
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.3.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/SolaceOperationDestination.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/SolaceOperationDestination.java
new file mode 100644
index 00000000..ef959dfb
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/SolaceOperationDestination.java
@@ -0,0 +1,83 @@
+package com.asyncapi.v3.binding.operation.solace;
+
+import com.asyncapi.v3.binding.operation.solace.queue.SolaceOperationQueue;
+import com.asyncapi.v3.binding.operation.solace.topic.SolaceOperationTopic;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Solace destination.
+ *
+ * Contains information about the destination in Solace PubSub+ Broker.
+ *
+ * @version 0.3.0
+ * @see Solace operation binding
+ * @author Dennis Brinley, Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonClassDescription("Describes Solace destination.")
+public class SolaceOperationDestination {
+
+ /**
+ * 'queue' or 'topic'. If the type is queue, then the subscriber can bind to the queue, which in turn will
+ * subscribe to the topic as represented by the channel name or to the provided topicSubscriptions.
+ */
+ @Nullable
+ @JsonProperty("destinationType")
+ @JsonPropertyDescription("'queue' or 'topic'. If the type is queue, then the subscriber can bind to the queue, which in turn will subscribe to the topic as represented by the channel name or to the provided topicSubscriptions.")
+ private Type destinationType;
+
+ /**
+ * 'direct' or 'persistent'. This determines the quality of service for publishing messages as documented here.
+ * Default is 'persistent'.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "deliveryMode", defaultValue = "persistent")
+ @JsonPropertyDescription("'direct' or 'persistent'. This determines the quality of service for publishing messages as documented at https://docs.solace.com/Get-Started/Core-Concepts-Message-Delivery-Modes.htm. Default is 'persistent'.")
+ private DeliveryMode deliveryMode = DeliveryMode.PERSISTENT;
+
+ /**
+ * Solace queue destination details.
+ */
+ @Nullable
+ @JsonProperty("queue")
+ @JsonPropertyDescription("Solace queue destination details.")
+ private SolaceOperationQueue queue;
+
+ /**
+ * Solace topic destination details.
+ */
+ @Nullable
+ @JsonProperty("topic")
+ @JsonPropertyDescription("Solace topic destination details.")
+ private SolaceOperationTopic topic;
+
+ public enum Type {
+
+ @JsonProperty("queue")
+ QUEUE,
+ @JsonProperty("topic")
+ TOPIC
+
+ }
+
+ public enum DeliveryMode {
+
+ @JsonProperty("direct")
+ DIRECT,
+ @JsonProperty("persistent")
+ PERSISTENT
+
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/queue/SolaceOperationQueue.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/queue/SolaceOperationQueue.java
new file mode 100644
index 00000000..d2c3f5c7
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/queue/SolaceOperationQueue.java
@@ -0,0 +1,82 @@
+package com.asyncapi.v3.binding.operation.solace.queue;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes Solace queue.
+ *
+ * Contains information about the queue in Solace PubSub+ Broker.
+ *
+ * @version 0.3.0
+ * @see Solace operation binding
+ * @author Dennis Brinley, Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonClassDescription("Describes Solace queue.")
+public class SolaceOperationQueue {
+
+ /**
+ * The name of the queue, only applicable when destinationType is 'queue'.
+ */
+ @Nullable
+ @JsonProperty("name")
+ @JsonPropertyDescription("The name of the queue, only applicable when destinationType is 'queue'.")
+ private String name;
+
+ /**
+ * A list of topics that the queue subscribes to, only applicable when destinationType is 'queue'.
+ * If none is given, the queue subscribes to the topic as represented by the channel name.
+ */
+ @Nullable
+ @JsonProperty("topicSubscriptions")
+ @JsonPropertyDescription("A list of topics that the queue subscribes to, only applicable when destinationType is 'queue'. If none is given, the queue subscribes to the topic as represented by the channel name.")
+ private List topicSubscriptions;
+
+ /**
+ * 'exclusive' or 'nonexclusive'. This is documented here. Only applicable when destinationType is 'queue'.
+ */
+ @Nullable
+ @JsonProperty("accessType")
+ @JsonPropertyDescription("'exclusive' or 'nonexclusive'. This is documented at https://docs.solace.com/Messaging/Guaranteed-Msg/Endpoints.htm#Queues. Only applicable when destinationType is 'queue'.")
+ private AccessType accessType;
+
+ /**
+ * The maximum amount of message spool that the given queue may use. This is documented here.
+ * Only applicable when destinationType is 'queue'.
+ */
+ @Nullable
+ @JsonProperty("maxMsgSpoolSize")
+ @JsonPropertyDescription("The maximum amount of message spool that the given queue may use. This is documented at https://docs.solace.com/Messaging/Guaranteed-Msg/Message-Spooling.htm#max-spool-usage. Only applicable when destinationType is 'queue'.")
+ private String maxMsgSpoolSize;
+
+ /**
+ * The maximum TTL to apply to messages to be spooled. This is documented here.
+ * Only applicable when destinationType is 'queue'.
+ */
+ @Nullable
+ @JsonProperty("maxTtl")
+ @JsonPropertyDescription("The maximum TTL to apply to messages to be spooled. This is documented at https://docs.solace.com/Messaging/Guaranteed-Msg/Configuring-Queues.htm. Only applicable when destinationType is 'queue'.")
+ private String maxTtl;
+
+ public enum AccessType {
+
+ @JsonProperty("exclusive")
+ EXCLUSIVE,
+ @JsonProperty("non-exclusive")
+ NON_EXCLUSIVE
+
+ }
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/topic/SolaceOperationTopic.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/topic/SolaceOperationTopic.java
new file mode 100644
index 00000000..9d20880d
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/solace/topic/SolaceOperationTopic.java
@@ -0,0 +1,39 @@
+package com.asyncapi.v3.binding.operation.solace.topic;
+
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+/**
+ * Describes Solace topic.
+ *
+ * Contains information about the topic in Solace PubSub+ Broker.
+ *
+ * @version 0.3.0
+ * @see Solace operation binding
+ * @author Dennis Brinley, Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonClassDescription("Describes Solace topic.")
+public class SolaceOperationTopic {
+
+ /**
+ * A list of topics that the client subscribes to, only applicable when destinationType is 'topic'.
+ * If none is given, the client subscribes to the topic as represented by the channel name.
+ */
+ @Nullable
+ @JsonProperty("topicSubscriptions")
+ @JsonPropertyDescription("A list of topics that the client subscribes to, only applicable when destinationType is 'topic'. If none is given, the client subscribes to the topic as represented by the channel name.")
+ protected List topicSubscriptions;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sqs/SQSOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sqs/SQSOperationBinding.java
new file mode 100644
index 00000000..de34599b
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/sqs/SQSOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.sqs;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SQS operation binding.
+ *
+ * @version 0.1.0
+ * @see SQS operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SQSOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/stomp/STOMPOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/stomp/STOMPOperationBinding.java
new file mode 100644
index 00000000..5679be40
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/stomp/STOMPOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.stomp;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes STOMP operation binding.
+ *
+ * @version 0.1.0
+ * @see STOMP operation binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class STOMPOperationBinding extends OperationBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/ws/WebSocketsOperationBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/ws/WebSocketsOperationBinding.java
new file mode 100644
index 00000000..a2e14bc5
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/operation/ws/WebSocketsOperationBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.operation.ws;
+
+import com.asyncapi.v3.binding.operation.OperationBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * This object contains server connection information about the IBM MQ server, referred to as an IBM MQ queue manager.
+ * This object contains additional connectivity information not possible to represent within the core AsyncAPI specification.
+ *
+ * @version 0.1.0
+ * @see IBM MQ server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes IBM MQ server binding.")
+public class IBMMQServerBinding extends ServerBinding {
+
+ /**
+ * Defines a logical group of IBM MQ server objects. This is necessary to specify multi-endpoint configurations used
+ * in high availability deployments. If omitted, the server object is not part of a group.
+ *
+ * MUST NOT be specified for URI Scheme http:// or file://
+ */
+ @Nullable
+ @JsonProperty("groupId")
+ @JsonPropertyDescription("Defines a logical group of IBM MQ server objects. This is necessary to specify multi-endpoint configurations used in high availability deployments. If omitted, the server object is not part of a group.")
+ private String groupId;
+
+ /**
+ * The name of the IBM MQ queue manager to bind to in the CCDT file.
+ *
+ * MUST NOT be specified for URI Scheme ibmmq://
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "ccdtQueueManagerName", defaultValue = "*")
+ @JsonPropertyDescription("The name of the IBM MQ queue manager to bind to in the CCDT file.")
+ private String ccdtQueueManagerName = "*";
+
+ /**
+ * The recommended cipher specification used to establish a TLS connection between the client and the IBM MQ queue manager.
+ * More information on SSL/TLS cipher specifications supported by IBM MQ can be found on this page in the IBM MQ Knowledge Center.
+ *
+ * MUST NOT be specified for protocol ibmmq or URI Scheme file:// or http://
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "cipherSpec", defaultValue = "ANY")
+ @JsonPropertyDescription("The recommended cipher specification used to establish a TLS connection between the client and the IBM MQ queue manager. More information on SSL/TLS cipher specifications supported by IBM MQ can be found on this page in the IBM MQ Knowledge Center.")
+ private String cipherSpec = "ANY";
+
+ /**
+ * If multiEndpointServer is true then multiple connections can be workload balanced and applications should not make
+ * assumptions as to where messages are processed. Where message ordering, or affinity to specific message resources
+ * is necessary, a single endpoint (multiEndpointServer = false) may be required.
+ *
+ * MUST NOT be specified for URI Scheme file:// or http://
+ */
+ @Builder.Default
+ @JsonProperty(value = "multiEndpointServer", defaultValue = "false")
+ @JsonPropertyDescription("If multiEndpointServer is true then multiple connections can be workload balanced and applications should not make assumptions as to where messages are processed. Where message ordering, or affinity to specific message resources is necessary, a single endpoint (multiEndpointServer = false) may be required. MUST NOT be specified for URI Scheme file:// or http://")
+ private Boolean multiEndpointServer = false;
+
+ /**
+ * The recommended value (in seconds) for the heartbeat sent to the queue manager during periods of inactivity.
+ * A value of zero means that no heart beats are sent. A value of 1 means that the client will use the value defined by the queue manager.
+ * More information on heart beat interval can be found on this page in the IBM MQ Knowledge Center.
+ *
+ * MUST be 0-999999
+ */
+ @Builder.Default
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "Heart beat interval must be greater or equals to 0"
+ )
+ @javax.validation.constraints.Max(
+ value = 999999,
+ message = "Heart beat interval must be less or equals to 999999"
+ )
+ @JsonProperty(value = "heartBeatInterval", defaultValue = "300")
+ @JsonPropertyDescription("The recommended value (in seconds) for the heartbeat sent to the queue manager during periods of inactivity. A value of zero means that no heart beats are sent. A value of 1 means that the client will use the value defined by the queue manager.")
+ private int heartBeatInterval = 300;
+
+ /**
+ * The version of this binding.
+ */
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/jms/JMSServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/jms/JMSServerBinding.java
new file mode 100644
index 00000000..406ac082
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/jms/JMSServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.jms;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes JMS server binding.
+ *
+ * @version 0.1.0
+ * @see JMS server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class JMSServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/kafka/KafkaServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/kafka/KafkaServerBinding.java
new file mode 100644
index 00000000..b0122269
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/kafka/KafkaServerBinding.java
@@ -0,0 +1,52 @@
+package com.asyncapi.v3.binding.server.kafka;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Kafka server binding.
+ *
+ * @version 0.4.0
+ * @see Kafka server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Kafka server binding.")
+public class KafkaServerBinding extends ServerBinding {
+
+ /**
+ * API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used)
+ */
+ @Nullable
+ @JsonProperty("schemaRegistryUrl")
+ @JsonPropertyDescription("API URL for the Schema Registry used when producing Kafka messages (if a Schema Registry was used)")
+ private String schemaRegistryUrl;
+
+ /**
+ * MUST NOT be specified if schemaRegistryUrl is not specified
+ *
+ * The vendor of Schema Registry and Kafka serdes library that should be used (e.g. apicurio, confluent, ibm, or karapace)
+ */
+ @Nullable
+ @JsonProperty("schemaRegistryVendor")
+ @JsonPropertyDescription("The vendor of Schema Registry and Kafka serdes library that should be used (e.g. apicurio, confluent, ibm, or karapace)")
+ private String schemaRegistryVendor;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.4.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mercure/MercureServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mercure/MercureServerBinding.java
new file mode 100644
index 00000000..6919e41d
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mercure/MercureServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.mercure;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Contains information about the server representation in MQTT.
+ *
+ * @version 0.1.0
+ * @see MQTT server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes MQTT server binding.")
+public class MQTTServerBinding extends ServerBinding {
+
+ /**
+ * The client identifier.
+ */
+ @Nullable
+ @JsonProperty("clientId")
+ @JsonPropertyDescription("The client identifier.")
+ private String clientId;
+
+ /**
+ * Whether to create a persisten connection or not. When false, the connection will be persistent.
+ */
+ @Nullable
+ @JsonProperty("cleanSession")
+ @JsonPropertyDescription("Whether to create a persisten connection or not. When false, the connection will be persistent.")
+ private Boolean cleanSession;
+
+ /**
+ * Last Will and Testament configuration.
+ */
+ @Nullable
+ @JsonProperty("lastWill")
+ @JsonPropertyDescription("Last Will and Testament configuration.")
+ private MQTTServerLastWillConfiguration lastWill;
+
+ /**
+ * Interval in seconds of the longest period of time the broker and the client can endure without sending a message.
+ */
+ @Nullable
+ @JsonProperty("keepAlive")
+ @JsonPropertyDescription("Interval in seconds of the longest period of time the broker and the client can endure without sending a message.")
+ private Integer keepAlive;
+
+ /**
+ * The version of this binding. If omitted, "latest" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt/MQTTServerLastWillConfiguration.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt/MQTTServerLastWillConfiguration.java
new file mode 100644
index 00000000..99e63a48
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt/MQTTServerLastWillConfiguration.java
@@ -0,0 +1,65 @@
+package com.asyncapi.v3.binding.server.mqtt;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes MQTT server last will configuration.
+ *
+ * @version 0.1.0
+ * @see MQTT server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@EqualsAndHashCode
+@NoArgsConstructor
+@AllArgsConstructor
+public class MQTTServerLastWillConfiguration {
+
+ /**
+ * The topic where the Last Will and Testament message will be sent.
+ */
+ @Nullable
+ @JsonProperty("topic")
+ @JsonPropertyDescription("The topic where the Last Will and Testament message will be sent.")
+ private String topic;
+
+ /**
+ * Defines how hard the broker/client will try to ensure that the Last Will and Testament message is received.
+ * Its value MUST be either 0, 1 or 2.
+ */
+ @Nullable
+ @javax.validation.constraints.Min(
+ value = 0,
+ message = "QoS must be greater or equals to 0."
+ )
+ @javax.validation.constraints.Max(
+ value = 2,
+ message = "QoS must be lower or equals to 0."
+ )
+ @JsonProperty("qos")
+ @JsonPropertyDescription("Defines how hard the broker/client will try to ensure that the Last Will and Testament message is received. Its value MUST be either 0, 1 or 2.")
+ private Integer qos;
+
+ /**
+ * Last Will message.
+ */
+ @Nullable
+ @JsonProperty("message")
+ @JsonPropertyDescription("Last Will message.")
+ private String message;
+
+ /**
+ * Whether the broker should retain the Last Will and Testament message or not.
+ */
+ @Nullable
+ @JsonProperty("retain")
+ @JsonPropertyDescription("Whether the broker should retain the Last Will and Testament message or not.")
+ private Boolean retain;
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt5/MQTT5ServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt5/MQTT5ServerBinding.java
new file mode 100644
index 00000000..a9522e04
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/mqtt5/MQTT5ServerBinding.java
@@ -0,0 +1,29 @@
+package com.asyncapi.v3.binding.server.mqtt5;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.*;
+
+/**
+ * Describes MQTT 5 server binding.
+ *
+ * @version 0.2.0
+ * @see MQTT 5 server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class MQTT5ServerBinding extends ServerBinding {
+
+ /**
+ * TODO: support reference, Schema object
+ * Session Expiry Interval in seconds or a Schema Object containing the definition of the interval.
+ */
+ private int sessionExpiryInterval;
+
+ @Builder.Default
+ private String bindingVersion = "0.2.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/nats/NATSServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/nats/NATSServerBinding.java
new file mode 100644
index 00000000..00331b04
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/nats/NATSServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.nats;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes NATS channel binding.
+ *
+ * @version 0.1.0
+ * @see NATS server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class NATSServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/pulsar/PulsarServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/pulsar/PulsarServerBinding.java
new file mode 100644
index 00000000..b67d8ef0
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/pulsar/PulsarServerBinding.java
@@ -0,0 +1,43 @@
+package com.asyncapi.v3.binding.server.pulsar;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Pulsar server binding.
+ *
+ * @version 0.1.0
+ * @see Redis server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Pulsar server binding.")
+public class PulsarServerBinding extends ServerBinding {
+
+ /**
+ * The pulsar tenant. If omitted, "public" MUST be assumed.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty(value = "tenant", defaultValue = "public")
+ @JsonPropertyDescription("The pulsar tenant. If omitted, \"public\" MUST be assumed.")
+ private String tenant = "public";
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.1.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/redis/RedisServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/redis/RedisServerBinding.java
new file mode 100644
index 00000000..bea734b6
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/redis/RedisServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.redis;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes Redis server binding.
+ *
+ * @version 0.1.0
+ * @see Redis server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class RedisServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sns/SNSServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sns/SNSServerBinding.java
new file mode 100644
index 00000000..87b7dc42
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sns/SNSServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.sns;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SNS server binding.
+ *
+ * @version 0.1.0
+ * @see SNS server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SNSServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/solace/SolaceServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/solace/SolaceServerBinding.java
new file mode 100644
index 00000000..c98e8470
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/solace/SolaceServerBinding.java
@@ -0,0 +1,44 @@
+package com.asyncapi.v3.binding.server.solace;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import com.fasterxml.jackson.annotation.JsonClassDescription;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyDescription;
+import lombok.*;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Describes Solace server binding.
+ *
+ * @version 0.3.0
+ * @see Solace server binding
+ * @author Dennis Brinley, Pavel Bodiachevskii
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+@JsonClassDescription("Describes Solace server binding.")
+public class SolaceServerBinding extends ServerBinding {
+
+ /**
+ * Message VPN of the Solace Broker
+ *
+ * e.g. msgVpn: solace-broker-msg-vpn
+ */
+ @Nullable
+ @JsonProperty("msgVpn")
+ @JsonPropertyDescription("Message VPN of the Solace Broker")
+ private String msgVpn;
+
+ /**
+ * The version of this binding.
+ */
+ @Nullable
+ @Builder.Default
+ @JsonProperty("bindingVersion")
+ @JsonPropertyDescription("The version of this binding.")
+ private String bindingVersion = "0.3.0";
+
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sqs/SQSServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sqs/SQSServerBinding.java
new file mode 100644
index 00000000..ce8f6962
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/sqs/SQSServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.sqs;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes SQS server binding.
+ *
+ * @version 0.1.0
+ * @see SQS server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class SQSServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/stomp/STOMPServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/stomp/STOMPServerBinding.java
new file mode 100644
index 00000000..871557c8
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/stomp/STOMPServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.stomp;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *
+ * Describes STOMP server binding.
+ *
+ * @version 0.1.0
+ * @see STOMP server binding
+ * @author Pavel Bodiachevskii
+ */
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class STOMPServerBinding extends ServerBinding {
+}
diff --git a/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/ws/WebSocketsServerBinding.java b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/ws/WebSocketsServerBinding.java
new file mode 100644
index 00000000..b76ab214
--- /dev/null
+++ b/asyncapi-core/src/main/java/com/asyncapi/v3/binding/server/ws/WebSocketsServerBinding.java
@@ -0,0 +1,21 @@
+package com.asyncapi.v3.binding.server.ws;
+
+import com.asyncapi.v3.binding.server.ServerBinding;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * This class MUST NOT contain any properties. Its name is reserved for future use.
+ *