This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory.git
The following commit(s) were added to refs/heads/main by this push:
new 2c912cd18 fix(java): Encoders.mapEncoder(TypeRef, TypeRef, TypeRef,
Fory) should load bean classes (#2494)
2c912cd18 is described below
commit 2c912cd187595d88e19a329a4548597e9351a5ad
Author: Steven Schlansker <[email protected]>
AuthorDate: Thu Aug 21 00:03:06 2025 -0700
fix(java): Encoders.mapEncoder(TypeRef, TypeRef, TypeRef, Fory) should load
bean classes (#2494)
We dynamically select the key and value type, and tried using this
overload of Encoders.mapEncoder
With the single-arg mapEncoder invocation, bean codec classes are loaded
with `token4BeanLoad`
But this overload never loads the bean classes leading to unexpected
exceptions during Map codec compile since bean codecs are not loaded
---
.../org/apache/fory/format/encoder/Encoders.java | 21 ++++++++++++++++++++-
.../apache/fory/format/encoder/MapEncoderTest.java | 18 ++++++++++++++++--
2 files changed, 36 insertions(+), 3 deletions(-)
diff --git
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
index 18845507b..522f54b27 100644
---
a/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
+++
b/java/fory-format/src/main/java/org/apache/fory/format/encoder/Encoders.java
@@ -474,7 +474,7 @@ public class Encoders {
TypeRef<?> keyToken = token4BeanLoad(set1, tuple2.f0);
TypeRef<?> valToken = token4BeanLoad(set2, tuple2.f1);
- MapEncoder<T> encoder = mapEncoder(token, keyToken, valToken, fory);
+ MapEncoder<T> encoder = mapEncoder0(token, keyToken, valToken, fory);
return createMapEncoder(encoder);
}
@@ -495,6 +495,22 @@ public class Encoders {
Preconditions.checkNotNull(keyToken);
Preconditions.checkNotNull(valToken);
+ Set<TypeRef<?>> set1 = beanSet(keyToken);
+ Set<TypeRef<?>> set2 = beanSet(valToken);
+ LOG.info("Find beans to load: {}, {}", set1, set2);
+
+ token4BeanLoad(set1, keyToken);
+ token4BeanLoad(set2, valToken);
+
+ return mapEncoder0(mapToken, keyToken, valToken, fory);
+ }
+
+ private static <T extends Map, K, V> MapEncoder<T> mapEncoder0(
+ TypeRef<? extends Map> mapToken, TypeRef<K> keyToken, TypeRef<V>
valToken, Fory fory) {
+ Preconditions.checkNotNull(mapToken);
+ Preconditions.checkNotNull(keyToken);
+ Preconditions.checkNotNull(valToken);
+
Schema schema = TypeInference.inferSchema(mapToken, false);
Field field = DataTypes.fieldOfSchema(schema, 0);
Field keyField = DataTypes.keyArrayFieldForMap(field);
@@ -685,6 +701,9 @@ public class Encoders {
TypeUtils.listBeansRecursiveInclusive(
beanClass,
new
TypeResolutionContext(CustomTypeEncoderRegistry.customTypeHandler(), true));
+ if (classes.isEmpty()) {
+ return null;
+ }
LOG.info("Create RowCodec for classes {}", classes);
CompileUnit[] compileUnits =
classes.stream()
diff --git
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
index cf40f70ac..3b0fdea73 100644
---
a/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
+++
b/java/fory-format/src/test/java/org/apache/fory/format/encoder/MapEncoderTest.java
@@ -134,9 +134,9 @@ public class MapEncoderTest {
@Test
public void testKVStructMap() {
Map<SimpleFoo, SimpleFoo> map = ImmutableMap.of(SimpleFoo.create(),
SimpleFoo.create());
- MapEncoder encoder = Encoders.mapEncoder(new TypeRef<Map<SimpleFoo,
SimpleFoo>>() {});
+ var encoder = Encoders.mapEncoder(new TypeRef<Map<SimpleFoo, SimpleFoo>>()
{});
testStreamingEncode(encoder, map);
- MapEncoder encoder1 = Encoders.mapEncoder(new TypeRef<Map<Foo, Foo>>() {});
+ var encoder1 = Encoders.mapEncoder(new TypeRef<Map<Foo, Foo>>() {});
testStreamingEncode(encoder1, ImmutableMap.of(Foo.create(), Foo.create()));
}
@@ -192,4 +192,18 @@ public class MapEncoderTest {
testStreamingEncode(encoder, lmap);
}
+
+ @Test
+ public <K, V> void testDynamicTypeDeclaration() {
+ Encoders.mapEncoder(
+ new TypeRef<HashMap<Integer, Bean>>() {},
+ TypeRef.of(Integer.class),
+ TypeRef.of(Bean.class),
+ null)
+ .encode(new HashMap<>());
+ }
+
+ public static class Bean {
+ int f1;
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]