-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Closed
Milestone
Description
I am using a library which generates the Jackson deserialization code as a delegate. I have created a class here which simulates this format:
public class HeroBattle {
private final Hero hero;
private HeroBattle(Hero hero) {
this.hero = requireNonNull(hero);
}
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "heroType")
public Hero getHero() {
return hero;
}
@JsonCreator
static HeroBattle fromJson(Delegate json) {
return new HeroBattle(json.hero);
}
public class Delegate {
@JsonProperty
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "heroType")
Hero hero;
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
final String json = mapper.writeValueAsString(new HeroBattle(new Superman()));
final HeroBattle battle = mapper.readValue(json, HeroBattle.class);
assert battle.getHero() instanceof Superman;
}
public interface Hero {
}
public static class Superman implements Hero {
public String getName() {
return "superman";
}
}
}
This results in the following exception:
Exception in thread "main" java.lang.IllegalStateException: No default constructor for [simple type, class HeroBattle]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createUsingDefault(StdValueInstantiator.java:211)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeWithExternalTypeId(BeanDeserializer.java:652)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:262)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2161)
at HeroBattle.main(HeroBattle.java:43)
Metadata
Metadata
Assignees
Labels
No labels