Sfoglia il codice sorgente

ISSUE-876 Fixed nullable fields (#878)

German Osin 3 anni fa
parent
commit
3d537f2bf1

+ 1 - 5
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<Schema> {
             Tuple2::getT2
         ));
 
-    return new ObjectFieldSchema(
-        fields, Collections.emptyList()
-    );
+    return new ObjectFieldSchema(fields, Collections.emptyList(), true);
   }
 
   private FieldSchema createObjectSchema(String name, Schema schema,

+ 22 - 1
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<String, FieldSchema> properties;
   private final List<String> required;
+  private final boolean nullable;
 
   public ObjectFieldSchema(Map<String, FieldSchema> properties,
                            List<String> required) {
+    this(properties, required, false);
+  }
+
+  public ObjectFieldSchema(Map<String, FieldSchema> properties,
+                           List<String> required, boolean nullable) {
     this.properties = properties;
     this.required = required;
+    this.nullable = nullable;
   }
 
   public Map<String, FieldSchema> 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));

+ 3 - 3
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\"}}}}}";