-
-
Notifications
You must be signed in to change notification settings - Fork 152
Closed
Labels
yamlIssue related to YAML format backendIssue related to YAML format backend
Milestone
Description
Tested with jackson-dataformat-yaml 2.11.3
package foo
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import java.util.List;
import org.junit.Test;
public class JacksonYamlTest {
static class Container {
@JsonProperty
List<Base> list;
}
@JsonTypeInfo(use = Id.NAME)
@JsonSubTypes({@Type(name="Derived", value=Derived.class)})
@JsonIdentityInfo(generator = ObjectIdGenerators.StringIdGenerator.class)
static class Base {
}
static class Derived extends Base {
@JsonProperty
String a;
}
@Test
public void typedObjectIdTest() throws Exception {
String yaml = "list:\n" +
" - !Derived &id1\n" +
" a: foo";
ObjectMapper mapper = new ObjectMapper (new YAMLFactory());
Container container = mapper.readValue (yaml, Container.class);
System.out.println (((Derived)container.list.get(0)).a);
}
}
throws
com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.String) [[ObjectId: key=id1, type=com.fasterxml.jackson.annotation.ObjectIdGenerators$StringIdGenerator, scope=NONE]] (through reference chain: JacksonYamlTest$Container["list"]->java.util.ArrayList[0])
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:397)
at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:368)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer._deserializeWithObjectId(CollectionDeserializer.java:406)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:277)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:249)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:293)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:156)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3468)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3436)
at JacksonYamlTest.typedObjectIdTest(JacksonYamlTest.java:41)
the problem is that SimpleObjectIdResolver.bindItem is called twice. Possibly, BeanDeserializerBase:1188 is not necessary at all.
Metadata
Metadata
Assignees
Labels
yamlIssue related to YAML format backendIssue related to YAML format backend