diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverter.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverter.java index ac12109d5a..707b11dbf6 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverter.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverter.java @@ -6,8 +6,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Optional; -import java.util.UUID; import java.util.stream.Collectors; import org.apache.avro.Schema; import reactor.util.function.Tuple2; @@ -82,9 +80,7 @@ public class AvroJsonSchemaConverter implements JsonSchemaConverter { Tuple2::getT2 )); - return new ObjectFieldSchema( - fields, Collections.emptyList() - ); + return new ObjectFieldSchema(fields, Collections.emptyList(), true); } private FieldSchema createObjectSchema(String name, Schema schema, diff --git a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ObjectFieldSchema.java b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ObjectFieldSchema.java index ca3182a723..3fe1f26fcd 100644 --- a/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ObjectFieldSchema.java +++ b/kafka-ui-api/src/main/java/com/provectus/kafka/ui/util/jsonschema/ObjectFieldSchema.java @@ -2,7 +2,10 @@ package com.provectus.kafka.ui.util.jsonschema; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.BooleanNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.node.TextNode; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -12,11 +15,18 @@ import reactor.util.function.Tuples; public class ObjectFieldSchema implements FieldSchema { private final Map properties; private final List required; + private final boolean nullable; public ObjectFieldSchema(Map properties, List required) { + this(properties, required, false); + } + + public ObjectFieldSchema(Map properties, + List required, boolean nullable) { this.properties = properties; this.required = required; + this.nullable = nullable; } public Map getProperties() { @@ -36,7 +46,18 @@ public class ObjectFieldSchema implements FieldSchema { Tuple2::getT2 )); final ObjectNode objectNode = mapper.createObjectNode(); - objectNode.setAll(new SimpleJsonType(JsonType.Type.OBJECT).toJsonNode(mapper)); + if (this.nullable) { + objectNode.set( + "type", + mapper.createArrayNode() + .add(JsonType.Type.OBJECT.getName()) + .add(JsonType.Type.NULL.getName()) + ); + } else { + objectNode.setAll( + new SimpleJsonType(JsonType.Type.OBJECT).toJsonNode(mapper) + ); + } objectNode.set("properties", mapper.valueToTree(nodes)); if (!required.isEmpty()) { objectNode.set("required", mapper.valueToTree(required)); diff --git a/kafka-ui-api/src/test/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverterTest.java b/kafka-ui-api/src/test/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverterTest.java index dbe37f5695..58daa739cf 100644 --- a/kafka-ui-api/src/test/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverterTest.java +++ b/kafka-ui-api/src/test/java/com/provectus/kafka/ui/util/jsonschema/AvroJsonSchemaConverterTest.java @@ -87,7 +87,7 @@ public class AvroJsonSchemaConverterTest { + "{\"$ref\":\"#/definitions/RecordInnerMessage\"}}," + "\"required\":[\"record\"],\"definitions\":" + "{\"RecordInnerMessage\":{\"type\":\"object\",\"" - + "properties\":{\"long_text\":{\"type\":\"object\"," + + "properties\":{\"long_text\":{\"type\":[\"object\", \"null\"]," + "\"properties\":{\"string\":{\"type\":\"string\"}}}," + "\"array\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}}," + "\"id\":{\"type\":\"integer\"},\"text\":{\"type\":\"string\"}," @@ -151,8 +151,8 @@ public class AvroJsonSchemaConverterTest { "{\"$id\":\"http://example.com/Message\"," + "\"$schema\":\"https://json-schema.org/draft/2020-12/schema\"," + "\"type\":\"object\",\"properties\":{\"text\":" - + "{\"type\":\"object\",\"properties\":{\"string\":" - + "{\"type\":\"string\"}}},\"value\":{\"type\":\"object\"," + + "{\"type\":[\"object\", \"null\"],\"properties\":{\"string\":" + + "{\"type\":\"string\"}}},\"value\":{\"type\":[\"object\", \"null\"]," + "\"properties\":{\"string\":{\"type\":\"string\"}," + "\"long\":{\"type\":\"integer\"}}}}}";