This is an automated email from the ASF dual-hosted git repository.
opwvhk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro.git
The following commit(s) were added to refs/heads/main by this push:
new 3fbea11ddf AVRO-4169 fix bug with custom encoder (#3440)
3fbea11ddf is described below
commit 3fbea11ddfc09e1542259ca3ad8cba2c7b897922
Author: Ashley Taylor <[email protected]>
AuthorDate: Mon Aug 4 18:57:51 2025 +1200
AVRO-4169 fix bug with custom encoder (#3440)
---
.../java/org/apache/avro/reflect/ReflectData.java | 8 ++++++++
.../org/apache/avro/reflect/TestAvroEncode.java | 21 +++++++++++----------
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git
a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
index 4b993c6fdd..916c15efbf 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/reflect/ReflectData.java
@@ -683,6 +683,14 @@ public class ReflectData extends SpecificData {
setElement(result, component);
return result;
}
+ AvroEncode enc = ReflectionUtil.getAvroEncode(c);
+ if (enc != null) {
+ try {
+ return
enc.using().getDeclaredConstructor().newInstance().getSchema();
+ } catch (Exception e) {
+ throw new AvroRuntimeException("Could not create schema from custom
serializer for " + c.getName());
+ }
+ }
AvroSchema explicit = c.getAnnotation(AvroSchema.class);
if (explicit != null) // explicit schema
return new Schema.Parser().parse(explicit.value());
diff --git
a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestAvroEncode.java
b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestAvroEncode.java
index daee2a39a9..7da7170e1b 100644
--- a/lang/java/avro/src/test/java/org/apache/avro/reflect/TestAvroEncode.java
+++ b/lang/java/avro/src/test/java/org/apache/avro/reflect/TestAvroEncode.java
@@ -37,23 +37,23 @@ public class TestAvroEncode {
@Test
void testWithinClass() throws IOException {
- var wrapper = new Wrapper(new R1("test"));
+ var wrapper = new Wrapper(new R1("321"));
var read = readWrite(wrapper);
- assertEquals("test", wrapper.getR1().getValue());
- assertEquals("test used this", read.getR1().getValue());
+ assertEquals("321", wrapper.getR1().getValue());
+ assertEquals("321 used this", read.getR1().getValue());
}
@Test
void testDirect() throws IOException {
- var r1 = new R1("test");
+ var r1 = new R1("123");
var read = readWrite(r1);
- assertEquals("test", r1.getValue());
- assertEquals("test used this", read.getValue());
+ assertEquals("123", r1.getValue());
+ assertEquals("123 used this", read.getValue());
}
@Test
@@ -127,14 +127,15 @@ public class TestAvroEncode {
public static class R1Encoding extends CustomEncoding<R1> {
{
- schema = Schema.createRecord("R1", null, null, false,
- Arrays.asList(new Schema.Field("value",
Schema.create(Schema.Type.STRING), null, null)));
+ schema = Schema.createRecord("R1", null,
"org.apache.avro.reflect.TestAvroEncode", false,
+ Arrays.asList(new Schema.Field("value",
Schema.create(Schema.Type.INT), null, null)));
}
@Override
protected void write(Object datum, Encoder out) throws IOException {
if (datum instanceof R1) {
- out.writeString(((R1) datum).getValue());
+ var value = ((R1) datum).getValue();
+ out.writeInt(Integer.parseInt(value));
} else {
throw new AvroTypeException("Expected R1, got " + datum.getClass());
}
@@ -143,7 +144,7 @@ public class TestAvroEncode {
@Override
protected R1 read(Object reuse, Decoder in) throws IOException {
- return new R1(in.readString() + " used this");
+ return new R1(in.readInt() + " used this");
}
}