Skip to content

JsonTypeInfo.As.EXTERNAL_PROPERTY does not work with a Delegate #1003

@alexwen

Description

@alexwen

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions