1 package com.fasterxml.jackson.databind.seq; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6 7 import org.junit.Assert; 8 9 import com.fasterxml.jackson.core.JsonGenerator; 10 import com.fasterxml.jackson.core.JsonProcessingException; 11 import com.fasterxml.jackson.core.type.TypeReference; 12 import com.fasterxml.jackson.databind.*; 13 import com.fasterxml.jackson.databind.module.SimpleModule; 14 import com.fasterxml.jackson.databind.testutil.NoCheckSubTypeValidator; 15 16 // for [databind#827] 17 public class PolyMapWriter827Test extends BaseMapTest 18 { 19 static class CustomKey { 20 String a; 21 int b; 22 23 @Override toString()24 public String toString() { return "BAD-KEY"; } 25 } 26 27 public class CustomKeySerializer extends JsonSerializer<CustomKey> { 28 @Override serialize(CustomKey key, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)29 public void serialize(CustomKey key, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 30 jsonGenerator.writeFieldName(key.a + "," + key.b); 31 } 32 } 33 testPolyCustomKeySerializer()34 public void testPolyCustomKeySerializer() throws Exception 35 { 36 ObjectMapper mapper = new ObjectMapper(); 37 mapper.activateDefaultTyping(NoCheckSubTypeValidator.instance, 38 ObjectMapper.DefaultTyping.NON_FINAL); 39 40 mapper.registerModule(new SimpleModule("keySerializerModule") 41 .addKeySerializer(CustomKey.class, new CustomKeySerializer())); 42 43 Map<CustomKey, String> map = new HashMap<CustomKey, String>(); 44 CustomKey key = new CustomKey(); 45 key.a = "foo"; 46 key.b = 1; 47 map.put(key, "bar"); 48 49 final ObjectWriter writer = mapper.writerFor(new TypeReference<Map<CustomKey,String>>() { }); 50 String json = writer.writeValueAsString(map); 51 Assert.assertEquals("[\"java.util.HashMap\",{\"foo,1\":\"bar\"}]", json); 52 } 53 } 54