Open lburgazzoli opened 2 years ago
Looks like it should work, but to know for sure you would need to include definition of type Message
.
It would probably be good to first debug with JSON writer/reader, see if there is an issue with POJO definition itself wrt round-trip handling.
The message definition is here: https://github.com/slackapi/java-slack-sdk/blob/main/slack-api-model/src/main/java/com/slack/api/model/Message.java
I bet the issue is with the gson annotation that are being used
Doing the same thing with plain json:
public static <T> void json(Class<T> type, T instance) throws Exception {
var mapper = new ObjectMapper();
var raw = mapper.writer().writeValueAsBytes(instance);
var obj = mapper.readerFor(type).readValue(raw);
System.out.println("> " + raw);
System.out.println("> " + obj);
}
Leads to:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.slack.api.model.block.LayoutBlock` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
at [Source: (byte[])"{"type":null,"subtype":null,"team":null,"channel":null,"user":null,"username":null,"text":null,"blocks":[{"type":"section","text":{"type":"mrkdwn","text":"*Hello from Jackson!*","verbatim":null},"blockId":null,"fields":null,"accessory":null}],"attachments":null,"ts":null,"threadTs":null,"intro":false,"starred":false,"wibblr":false,"pinnedTo":null,"reactions":null,"botId":null,"botLink":null,"displayAsBot":false,"botProfile":null,"icons":null,"file":null,"files":null,"upload":false,"parentUserId""[truncated 373 bytes]; line: 1, column: 106] (through reference chain: com.slack.api.model.Message["blocks"]->java.util.ArrayList[0])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
at com.fasterxml.jackson.databind.deser.AbstractDeserializer.deserialize(AbstractDeserializer.java:274)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeFromArray(CollectionDeserializer.java:355)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:244)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:28)
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:324)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:187)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2033)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1528)
at av.json(av.java:37)
at av.main(av.java:29)
Exception claims that LayoutBlock
is abstract
type: if so, there has to be something to tell which actual concrete type is to be constructed. This can be done by:
@JsonDeserialize(as = ConcreteType.class)
)Gson annotations would not be used but you would likely need their equivalent for Jackson if default names are changed (which seems to be the case).
I wrote a small example that is about encoding and decoding a POJO with an auto generated schema, the code is like:
When running the code, then an exception is thrown:
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.