package com.fasterxml.jackson.databind.objectid;
import java.util.concurrent.atomic.AtomicReference;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.fasterxml.jackson.databind.*;
public class ReferentialWithObjectIdTest extends BaseMapTest
{
public static class EmployeeList {
public AtomicReference<Employee> first;
}
@JsonIdentityInfo(property="id", generator=ObjectIdGenerators.PropertyGenerator.class)
public static class Employee {
public int id;
public String name;
public AtomicReference<Employee> next;
public Employee next(Employee n) {
next = new AtomicReference<Employee>(n);
return this;
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
public void testAtomicWithObjectId() throws Exception
{
Employee first = new Employee();
first.id = 1;
first.name = "Alice";
Employee second = new Employee();
second.id = 2;
second.name = "Bob";
first.next(second);
second.next(first);
EmployeeList input = new EmployeeList();
input.first = new AtomicReference<Employee>(first);
String json = MAPPER.writeValueAsString(input);
// and back
EmployeeList result = MAPPER.readValue(json, EmployeeList.class);
Employee firstB = result.first.get();
assertNotNull(firstB);
assertEquals("Alice", firstB.name);
Employee secondB = firstB.next.get();
assertNotNull(secondB);
assertEquals("Bob", secondB.name);
assertNotNull(secondB.next.get());
assertSame(firstB, secondB.next.get());
}
}