package com.fasterxml.jackson.databind.contextual; import java.io.IOException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; public class TestContextAttributeWithSer extends BaseMapTest { final static String KEY = "foobar"; @SuppressWarnings("serial") static class PrefixStringSerializer extends StdScalarSerializer<String> { protected PrefixStringSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException { Integer I = (Integer) provider.getAttribute(KEY); if (I == null) { I = Integer.valueOf(0); } int i = I.intValue(); provider.setAttribute(KEY, Integer.valueOf(i + 1)); jgen.writeString("" +i+":"+value); } } static class TestPOJO { @JsonSerialize(using=PrefixStringSerializer.class) public String value; public TestPOJO(String str) { value = str; } } /* /********************************************************** /* Test methods /********************************************************** */ final ObjectMapper MAPPER = objectMapper(); public void testSimplePerCall() throws Exception { final String EXP = aposToQuotes("[{'value':'0:a'},{'value':'1:b'}]"); ObjectWriter w = MAPPER.writer(); final TestPOJO[] INPUT = new TestPOJO[] { new TestPOJO("a"), new TestPOJO("b") }; assertEquals(EXP, w.writeValueAsString(INPUT)); // also: ensure that we don't retain per-call state accidentally: assertEquals(EXP, w.writeValueAsString(INPUT)); } public void testSimpleDefaults() throws Exception { final String EXP = aposToQuotes("{'value':'3:xyz'}"); final TestPOJO INPUT = new TestPOJO("xyz"); String json = MAPPER.writer().withAttribute(KEY, Integer.valueOf(3)) .writeValueAsString(INPUT); assertEquals(EXP, json); String json2 = MAPPER.writer().withAttribute(KEY, Integer.valueOf(3)) .writeValueAsString(INPUT); assertEquals(EXP, json2); } public void testHierarchic() throws Exception { final TestPOJO[] INPUT = new TestPOJO[] { new TestPOJO("a"), new TestPOJO("b") }; final String EXP = aposToQuotes("[{'value':'2:a'},{'value':'3:b'}]"); ObjectWriter w = MAPPER.writer().withAttribute(KEY, Integer.valueOf(2)); assertEquals(EXP, w.writeValueAsString(INPUT)); // and verify state clearing: assertEquals(EXP, w.writeValueAsString(INPUT)); } }