| package com.fasterxml.jackson.databind.objectid; |
| |
| import com.fasterxml.jackson.annotation.*; |
| |
| import com.fasterxml.jackson.core.type.TypeReference; |
| import com.fasterxml.jackson.databind.*; |
| |
| import java.util.*; |
| |
| public class TestAbstractWithObjectId extends BaseMapTest |
| { |
| interface BaseInterface { } |
| |
| @JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "@id") |
| static class BaseInterfaceImpl implements BaseInterface { |
| |
| @JsonProperty |
| private List<BaseInterfaceImpl> myInstances = new ArrayList<BaseInterfaceImpl>(); |
| |
| void addInstance(BaseInterfaceImpl instance) { |
| myInstances.add(instance); |
| } |
| } |
| |
| static class ListWrapper<T extends BaseInterface> { |
| |
| @JsonProperty |
| private List<T> myList = new ArrayList<T>(); |
| |
| void add(T t) { |
| myList.add(t); |
| } |
| |
| int size() { |
| return myList.size(); |
| } |
| } |
| |
| public void testIssue877() throws Exception |
| { |
| // make two instances |
| BaseInterfaceImpl one = new BaseInterfaceImpl(); |
| BaseInterfaceImpl two = new BaseInterfaceImpl(); |
| |
| // add them to each other's list to show identify info being used |
| one.addInstance(two); |
| two.addInstance(one); |
| |
| // make a typed version of the list and add the 2 instances to it |
| ListWrapper<BaseInterfaceImpl> myList = new ListWrapper<BaseInterfaceImpl>(); |
| myList.add(one); |
| myList.add(two); |
| |
| // make an object mapper that will add class info in so deserialisation works |
| ObjectMapper om = new ObjectMapper(); |
| om.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class"); |
| |
| // write and print the JSON |
| String json = om.writerWithDefaultPrettyPrinter().writeValueAsString(myList); |
| ListWrapper<BaseInterfaceImpl> result; |
| |
| result = om.readValue(json, new TypeReference<ListWrapper<BaseInterfaceImpl>>() { }); |
| |
| assertNotNull(result); |
| // see what we get back |
| assertEquals(2, result.size()); |
| } |
| } |