You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by si...@apache.org on 2021/05/05 23:06:45 UTC

[pulsar] branch master updated: [CLIENT] fixed NPE in GenericJsonRecord (#10482)

This is an automated email from the ASF dual-hosted git repository.

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new ff076e3  [CLIENT] fixed NPE in GenericJsonRecord (#10482)
ff076e3 is described below

commit ff076e3830b1dcd2d2a56c23681e8129c4fcddd2
Author: Abhilash Mandaliya <ab...@gmail.com>
AuthorDate: Thu May 6 04:35:53 2021 +0530

    [CLIENT] fixed NPE in GenericJsonRecord (#10482)
    
    Fixes #10472
    
    ### Motivation
    GenericJsonRecord should not error out if the non-existent field is queried.
    
    ### Modifications
    
    Added a null check and returning null if the field does not exist.
    
    ### Verifying this change
    
    Extended one of the tests for GenericJsonRecord.
---
 .../main/java/org/apache/pulsar/client/api/schema/GenericRecord.java | 2 +-
 .../apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java  | 3 +++
 .../java/org/apache/pulsar/client/impl/schema/JSONSchemaTest.java    | 5 +++++
 3 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/pulsar-client-api/src/main/java/org/apache/pulsar/client/api/schema/GenericRecord.java b/pulsar-client-api/src/main/java/org/apache/pulsar/client/api/schema/GenericRecord.java
index 23665eb..f83c01f 100644
--- a/pulsar-client-api/src/main/java/org/apache/pulsar/client/api/schema/GenericRecord.java
+++ b/pulsar-client-api/src/main/java/org/apache/pulsar/client/api/schema/GenericRecord.java
@@ -58,7 +58,7 @@ public interface GenericRecord extends GenericObject {
      * Retrieve the value of the provided <tt>fieldName</tt>.
      *
      * @param fieldName the field name
-     * @return the value object
+     * @return the value object, or null if field doesn't exist
      */
     Object getField(String fieldName);
 
diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
index 2395439..8564703 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/schema/generic/GenericJsonRecord.java
@@ -60,6 +60,9 @@ public class GenericJsonRecord extends VersionedGenericRecord {
     @Override
     public Object getField(String fieldName) {
         JsonNode fn = jn.get(fieldName);
+        if (fn == null) {
+            return null;
+        }
         if (fn.isContainerNode()) {
             AtomicInteger idx = new AtomicInteger(0);
             List<Field> fields = Lists.newArrayList(fn.fieldNames())
diff --git a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/JSONSchemaTest.java b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/JSONSchemaTest.java
index b8e8e0d..0dd11ad 100644
--- a/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/JSONSchemaTest.java
+++ b/pulsar-client/src/test/java/org/apache/pulsar/client/impl/schema/JSONSchemaTest.java
@@ -47,9 +47,11 @@ import org.apache.pulsar.client.impl.schema.SchemaTestUtils.DerivedFoo;
 import org.apache.pulsar.client.impl.schema.SchemaTestUtils.Foo;
 import org.apache.pulsar.client.impl.schema.SchemaTestUtils.NestedBar;
 import org.apache.pulsar.client.impl.schema.SchemaTestUtils.NestedBarList;
+import org.apache.pulsar.client.impl.schema.generic.GenericJsonRecord;
 import org.apache.pulsar.client.impl.schema.generic.GenericSchemaImpl;
 import org.apache.pulsar.common.schema.SchemaInfo;
 import org.apache.pulsar.common.schema.SchemaType;
+import org.assertj.core.api.Assertions;
 import org.json.JSONException;
 import org.skyscreamer.jsonassert.JSONAssert;
 import org.testng.Assert;
@@ -448,5 +450,8 @@ public class JSONSchemaTest {
         assertEquals("USA", seller3Record.getField("state"));
         assertEquals("oakstreet", seller3Record.getField("street"));
         assertEquals(9999, seller3Record.getField("zipCode"));
+
+        assertTrue(pc3Record instanceof GenericJsonRecord);
+        Assertions.assertThatCode(() -> pc3Record.getField("I_DO_NOT_EXIST")).doesNotThrowAnyException();
     }
 }