You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by dw...@apache.org on 2020/09/14 19:48:25 UTC
[flink] 01/07: [hotfix] Fix Pojo comparator field access
This is an automated email from the ASF dual-hosted git repository.
dwysakowicz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
commit e2b42645ada3c57d53865fac4531e45019f2632f
Author: Dawid Wysakowicz <dw...@apache.org>
AuthorDate: Thu Sep 10 10:14:40 2020 +0200
[hotfix] Fix Pojo comparator field access
The PojoComparator assumes it can access a field of a pojo directly. It assumes the field is either public or setAccessible was called before. This is the case though only if the record went through serialization. This is not the case e.g. in CollectionExecution mode.
Starting from this commit we make all fields accessible in
PojoComparator constructor.
---
.../flink/api/java/typeutils/runtime/PojoComparator.java | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/runtime/PojoComparator.java b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/runtime/PojoComparator.java
index 529fd0d..c19bcc6 100644
--- a/flink-core/src/main/java/org/apache/flink/api/java/typeutils/runtime/PojoComparator.java
+++ b/flink-core/src/main/java/org/apache/flink/api/java/typeutils/runtime/PojoComparator.java
@@ -36,7 +36,7 @@ import org.apache.flink.util.InstantiationUtil;
@Internal
public final class PojoComparator<T> extends CompositeTypeComparator<T> implements java.io.Serializable {
-
+
private static final long serialVersionUID = 1L;
// Reflection fields for the comp fields
@@ -70,6 +70,10 @@ public final class PojoComparator<T> extends CompositeTypeComparator<T> implemen
int nKeyLen = 0;
boolean inverted = false;
+ for (Field keyField : keyFields) {
+ keyField.setAccessible(true);
+ }
+
for (int i = 0; i < this.comparators.length; i++) {
TypeComparator<?> k = this.comparators[i];
if(k == null) {
@@ -170,7 +174,7 @@ public final class PojoComparator<T> extends CompositeTypeComparator<T> implemen
}
}
}
-
+
/**
* This method is handling the IllegalAccess exceptions of Field.get()
*/
@@ -180,7 +184,7 @@ public final class PojoComparator<T> extends CompositeTypeComparator<T> implemen
} catch (NullPointerException npex) {
throw new NullKeyFieldException("Unable to access field "+field+" on object "+object);
} catch (IllegalAccessException iaex) {
- throw new RuntimeException("This should not happen since we call setAccesssible(true) in PojoTypeInfo."
+ throw new RuntimeException("This should not happen since we call setAccesssible(true) in the ctor."
+ " fields: " + field + " obj: " + object);
}
return object;