FasterXML / FasterXML/jackson-dataformats-binary
[avro] Unable to encode and decode a POJO with an auto-generated schema
- 主要語言
- 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 還沒有評估資料。