FasterXML / FasterXML/jackson-dataformats-binary

[avro] Unable to encode and decode a POJO with an auto-generated schema

未關閉
#309 4 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
avro
主要語言
Java
星號
347
分支
156
平均合併
3 天 3 小時
30 天內合併 PR
22

描述

I wrote a small example that is about encoding and decoding a POJO with an auto generated schema, the code is like:

```java
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS org.slf4j:slf4j-simple:1.7.30
//DEPS com.fasterxml.jackson.core:jackson-core:2.12.5
//DEPS com.fasterxml.jackson.core:jackson-databind:2.12.5
//DEPS com.fasterxml.jackson.dataformat:jackson-dataformat-avro:2.12.5
//DEPS com.slack.api:slack-api-model:1.8.1

import java.util.List;
import java.util.UUID;

import com.fasterxml.jackson.dataformat.avro.AvroMapper;
import com.slack.api.model.Message;
import com.slack.api.model.block.SectionBlock;
import com.slack.api.model.block.composition.MarkdownTextObject;

public class av {
public static void main(String[] args) throws Exception {
var message = new Message();
message.setBlocks(List.of(SectionBlock
.builder()
.text(MarkdownTextObject
.builder()
.text("*Hello from Jackson!*")
.build())
.build()));

serdes(Message.class, message);
}

public static void serdes(Class type, T instance) throws Exception {
var mapper = new AvroMapper();
var schema = mapper.schemaFor(type);

var raw = mapper.writer().with(schema).writeValueAsBytes(instance);
var obj = mapper.readerFor(type).with(schema).readValue(raw);

System.out.println("> " + raw);
System.out.println("> " + obj);
}
}
```

When running the code, then an exception is thrown:

```
xception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No field named 'accessory' (through reference chain: com.slack.api.model.Message["blocks"]->java.util.ImmutableCollections$List12[0]->com.slack.api.model.block.SectionBlock["accessory"])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:390)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:349)
at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:316)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:778)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1514)
at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1215)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsBytes(ObjectWriter.java:1108)
at av.serdes(av.java:35)
at av.main(av.java:28)
Suppressed: com.fasterxml.jackson.core.JsonGenerationException: Failed to close AvroGenerator: (java.lang.NullPointerException): null of boolean in field displayAsBot of com.slack.api.model.Message
at com.fasterxml.jackson.dataformat.avro.AvroGenerator.close(AvroGenerator.java:353)
at com.fasterxml.jackson.databind.util.ClassUtil.closeOnFailAndThrowAsIOE(ClassUtil.java:497)
at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1217)
... 3 more
Caused by: java.lang.NullPointerException: null of boolean in field displayAsBot of com.slack.api.model.Message
at org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:145)
at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:139)
at com.fasterxml.jackson.dataformat.avro.ser.NonBSGenericDatumWriter.write(NonBSGenericDatumWriter.java:123)
at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:62)
at com.fasterxml.jackson.dataformat.avro.ser.RootContext.complete(RootContext.java:122)
at com.fasterxml.jackson.dataformat.avro.AvroGenerator._complete(AvroGenerator.java:627)
at com.fasterxml.jackson.dataformat.avro.AvroGenerator.close(AvroGenerator.java:348)
... 5 more
Caused by: java.lang.NullPointerException
at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:134)
at com.fasterxml.jackson.dataformat.avro.ser.NonBSGenericDatumWriter.write(NonBSGenericDatumWriter.java:43)
at org.apache.avro.generic.GenericDatumWriter.writeField(GenericDatumWriter.java:166)
at org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:156)
at org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:118)
... 10 more
Caused by: java.lang.IllegalStateException: No field named 'accessory'
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext._reportUnknownField(ObjectWriteContext.java:136)
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext.writeFieldName(ObjectWriteContext.java:65)
at com.fasterxml.jackson.dataformat.avro.AvroGenerator.writeFieldName(AvroGenerator.java:307)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:694)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770)
... 14 more
```

I'm not sure if this comes from how the `Message` class is implemented (unfortunately it is outside of my control) or about eh way I'm using jackson.

Any help would be appreciated.

貢獻指南

這個儲存庫沒有索引到貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。