-
-
Notifications
You must be signed in to change notification settings - Fork 144
Closed
Description
Avro version 1.9.0 was released last month (https://mvnrepository.com/artifact/org.apache.avro/avro) and my team has run in to compatibility issues between jackson-dataformat-avro
and this latest release.
In particular, it looks to be the case that Avro has switched from Codehaus Jackson to FasterXML Jackson, which results in NoSuchMethodError
thrown when accessing utility methods.
The following test exposes the issue:
@Test
public void beanShouldBeSerializableAsAvroBinaryAndDeserializable() throws Exception {
TestBean testBean = new TestBean();
testBean.setData("Data");
AvroMapper avroMapper = new AvroMapper();
AvroSchema avroSchema = avroMapper.schemaFor(TestBean.class);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
avroMapper.writer().with(avroSchema).writeValue(outputStream, testBean);
byte[] serialized = outputStream.toByteArray();
assertNotNull(serialized);
assertTrue(serialized.length > 0);
TestBean deserialized = avroMapper.readerFor(TestBean.class).with(avroSchema).readValue(serialized);
assertEquals(testBean, deserialized);
}
public static final class TestBean {
private String data;
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
TestBean testBean = (TestBean) o;
return Objects.equals(data, testBean.data);
}
@Override
public int hashCode() {
return Objects.hash(data);
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
This test passes on v1.8.2 of Avro, but fails with v1.9.0 on the following:
java.lang.NoSuchMethodError: org.apache.avro.util.internal.JacksonUtils.toObject(Lorg/codehaus/jackson/JsonNode;)Ljava/lang/Object;
at com.fasterxml.jackson.dataformat.avro.schema.RecordVisitor.schemaFieldForWriter(RecordVisitor.java:192)
at com.fasterxml.jackson.dataformat.avro.schema.RecordVisitor.optionalProperty(RecordVisitor.java:121)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.depositSchemaProperty(BeanPropertyWriter.java:839)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.acceptJsonFormatVisitor(BeanSerializerBase.java:861)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.acceptJsonFormatVisitor(DefaultSerializerProvider.java:566)
at com.fasterxml.jackson.databind.ObjectMapper.acceptJsonFormatVisitor(ObjectMapper.java:3874)
at com.fasterxml.jackson.databind.ObjectMapper.acceptJsonFormatVisitor(ObjectMapper.java:3853)
at com.fasterxml.jackson.dataformat.avro.AvroMapper.schemaFor(AvroMapper.java:96)
Note that we are using com.fasterxml.jackson.dataformat:jackson-dataformat-avro:2.9.9