Skip to content

[avro] Unable to encode and decodea POJO with an auto-generated schema #309

Open
@lburgazzoli

Description

@lburgazzoli

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

///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 <T> void serdes(Class<T> 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions