You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by tw...@apache.org on 2021/05/17 14:38:56 UTC

[flink] 02/02: [hotfix][table-planner-blink] Give more helpful exception for codegen structured types

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

twalthr pushed a commit to branch release-1.13
in repository https://gitbox.apache.org/repos/asf/flink.git

commit 3f59de843063c01fa917cc94bd74cf15fbb91b7d
Author: Timo Walther <tw...@apache.org>
AuthorDate: Mon May 17 11:01:50 2021 +0200

    [hotfix][table-planner-blink] Give more helpful exception for codegen structured types
---
 .../table/types/extraction/ExtractionUtils.java    |  2 +-
 .../data/conversion/StructuredObjectConverter.java | 29 ++++++++++++++++++++--
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
index 32f4fa8..c4d196c 100644
--- a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
+++ b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/types/extraction/ExtractionUtils.java
@@ -187,7 +187,7 @@ public final class ExtractionUtils {
             }
         }
         throw extractionError(
-                "Could not to find a field named '%s' in class '%s' for structured type.",
+                "Could not find a field named '%s' in class '%s' for structured type.",
                 fieldName, clazz.getName());
     }
 
diff --git a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/conversion/StructuredObjectConverter.java b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/conversion/StructuredObjectConverter.java
index a1a5632..b440df0 100644
--- a/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/conversion/StructuredObjectConverter.java
+++ b/flink-table/flink-table-runtime-blink/src/main/java/org/apache/flink/table/data/conversion/StructuredObjectConverter.java
@@ -250,7 +250,10 @@ public class StructuredObjectConverter<T> implements DataStructureConverter<RowD
             // field is accessible with a getter
             final Method getter =
                     getStructuredFieldGetter(implementationClass, field)
-                            .orElseThrow(IllegalStateException::new);
+                            .orElseThrow(
+                                    () ->
+                                            fieldNotReadableException(
+                                                    implementationClass, fieldName));
             accessExpr = expr("external.", getter.getName(), "()");
         }
         accessExpr = castExpr(accessExpr, fieldClass);
@@ -264,6 +267,25 @@ public class StructuredObjectConverter<T> implements DataStructureConverter<RowD
                 "))");
     }
 
+    private static IllegalStateException fieldNotReadableException(
+            Class<?> implementationClass, String fieldName) {
+        return new IllegalStateException(
+                String.format(
+                        "Could not find a getter for field '%s' in class '%s'. "
+                                + "Make sure that the field is readable (via public visibility or getter).",
+                        fieldName, implementationClass.getName()));
+    }
+
+    private static IllegalStateException fieldNotWritableException(
+            Class<?> implementationClass, String fieldName) {
+        return new IllegalStateException(
+                String.format(
+                        "Could not find a setter for field '%s' in class '%s'. "
+                                + "Make sure that the field is writable (via public visibility, "
+                                + "setter, or full constructor).",
+                        fieldName, implementationClass.getName()));
+    }
+
     private static String parameterExpr(int pos, Class<?> fieldClass) {
         final String conversionExpr =
                 expr(
@@ -295,7 +317,10 @@ public class StructuredObjectConverter<T> implements DataStructureConverter<RowD
             // field is accessible with a setter
             final Method setter =
                     getStructuredFieldSetter(implementationClass, field)
-                            .orElseThrow(IllegalStateException::new);
+                            .orElseThrow(
+                                    () ->
+                                            fieldNotWritableException(
+                                                    implementationClass, fieldName));
             return expr(
                     "structured.",
                     setter.getName(),