I'm trying to do something like https://github.com/brharrington/jackson-databind/blob/master/src/test/java/com/fasterxml/jackson/databind/ser/TestGenericTypes.java#L10 but with a twist. How can I serialise and deserialise an object graph like this?
public class Envelope {
// more fields here
// CRUX IS HERE; I can't type it as List<BaseMessage<>> unfortunately
public List<BaseMessage<Object>> payload;
}
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "n"
)
@JsonSubTypes({
@JsonSubTypes.Type(value = AMessage.class, name = "a"),
@JsonSubTypes.Type(value = BMessage.class, name = "b"),
})
public abstract class BaseMessage<TData> {
// discriminator field getters and setters (no abstract field in Java)
public abstract String getN();
public abstract void setN(String n);
// more props
public TData ps;
public SpanContext s;
}
public class AMessage extends BaseMessage<MessageData> {
public String n = "a";
@Override
public String getN() {
return n;
}
@Override
public void setN(String n) {
this.n = n;
}
}
public class MessageData {
public String example;
// more props
}
public class BMessage extends BaseMessage<MessageData> {
public String n = "b";
@Override
public String getN() {
return n;
}
@Override
public void setN(String n) {
this.n = n;
}
}
- I'd be happiest if I can configure this with jackson annotations
- Secondly, if I can use TypeReference in some way
- Thirdly, if I can type the list as
List<JsonValue>and subsequently call jackson explicitly by reading the discriminator fieldnmanually and then calling jackson with the actual type