package com.fasterxml.jackson.failing; import java.util.concurrent.ConcurrentHashMap; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; public class ObjectIdWithBuilder1496Test extends BaseMapTest { @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") @JsonDeserialize(builder=POJOBuilder.class) static class POJO { private long id; public long getId() { return id; } private int var; public int getVar() { return var; } private POJO (long id, int var) { this.id = id; this.var = var; } @Override public String toString() { return "id: " + id + ", var: " + var; } } @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") @JsonPOJOBuilder(withPrefix = "", buildMethodName="readFromCacheOrBuild") static final class POJOBuilder { // Standard builder stuff private long id; private int var; public POJOBuilder id(long _id) { id = _id; return this; } public POJOBuilder var(int _var) { var = _var; return this; } public POJO build() { return new POJO(id, var); } // Special build method for jackson deserializer that caches objects already deserialized private final static ConcurrentHashMap<Long, POJO> cache = new ConcurrentHashMap<>(); public POJO readFromCacheOrBuild() { POJO pojo = cache.get(id); if (pojo == null) { POJO newPojo = build(); pojo = cache.putIfAbsent(id, newPojo); if (pojo == null) { pojo = newPojo; } } return pojo; } } /* /********************************************************** /* Test methods /********************************************************** */ private final ObjectMapper MAPPER = newObjectMapper(); public void testBuilderId1496() throws Exception { POJO input = new POJOBuilder().id(123L).var(456).build(); String json = MAPPER.writeValueAsString(input); POJO result = MAPPER.readValue(json, POJO.class); assertNotNull(result); } }