IGNITE-3277 Fixed null key serialization.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/482015e9 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/482015e9 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/482015e9 Branch: refs/heads/ignite-1232 Commit: 482015e9924425c70901fdae36222110af6e6c16 Parents: 0c5db20 Author: Alexey Kuznetsov <[email protected]> Authored: Tue Jun 21 17:49:47 2016 +0700 Committer: Alexey Kuznetsov <[email protected]> Committed: Tue Jun 21 17:49:47 2016 +0700 ---------------------------------------------------------------------- .../JettyRestProcessorAbstractSelfTest.java | 33 ++++++++++++++++++++ .../http/jetty/GridJettyObjectMapper.java | 23 +++++++++++--- 2 files changed, 52 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/482015e9/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index ad667ed..81bffcf 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -339,6 +339,39 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro /** * @throws Exception If failed. */ + public void testNullMapKeyAndValue() throws Exception { + Map<String, String> map1 = new HashMap<>(); + map1.put(null, null); + map1.put("key", "value"); + + jcache().put("mapKey1", map1); + + String ret = content(F.asMap("cmd", GridRestCommand.CACHE_GET.key(), "key", "mapKey1")); + + info("Get command result: " + ret); + + JsonNode res = jsonResponse(ret); + + assertEquals(F.asMap("", null, "key", "value"), JSON_MAPPER.treeToValue(res, HashMap.class)); + + Map<String, String> map2 = new HashMap<>(); + map2.put(null, "value"); + map2.put("key", null); + + jcache().put("mapKey2", map2); + + ret = content(F.asMap("cmd", GridRestCommand.CACHE_GET.key(), "key", "mapKey2")); + + info("Get command result: " + ret); + + res = jsonResponse(ret); + + assertEquals(F.asMap("", "value", "key", null), JSON_MAPPER.treeToValue(res, HashMap.class)); + } + + /** + * @throws Exception If failed. + */ public void testSimpleObject() throws Exception { SimplePerson p = new SimplePerson(1, "Test", java.sql.Date.valueOf("1977-01-26"), 1000.55, 39, "CIO", 25); http://git-wip-us.apache.org/repos/asf/ignite/blob/482015e9/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java ---------------------------------------------------------------------- diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java index f09b583..6289bdb 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyObjectMapper.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.processors.rest.protocols.http.jetty; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; @@ -67,8 +68,16 @@ public class GridJettyObjectMapper extends ObjectMapper { registerModule(module); } + /** Custom {@code null} key serializer. */ + private static final JsonSerializer<Object> NULL_KEY_SERIALIZER = new JsonSerializer<Object>() { + /** {@inheritDoc} */ + @Override public void serialize(Object val, JsonGenerator gen, SerializerProvider ser) throws IOException { + gen.writeFieldName(""); + } + }; + /** Custom {@code null} value serializer. */ - private static final JsonSerializer<Object> NULL_SERIALIZER = new JsonSerializer<Object>() { + private static final JsonSerializer<Object> NULL_VALUE_SERIALIZER = new JsonSerializer<Object>() { /** {@inheritDoc} */ @Override public void serialize(Object val, JsonGenerator gen, SerializerProvider ser) throws IOException { gen.writeNull(); @@ -76,7 +85,7 @@ public class GridJettyObjectMapper extends ObjectMapper { }; /** Custom {@code null} string serializer. */ - private static final JsonSerializer<Object> NULL_STRING_SERIALIZER = new JsonSerializer<Object>() { + private static final JsonSerializer<Object> NULL_STRING_VALUE_SERIALIZER = new JsonSerializer<Object>() { /** {@inheritDoc} */ @Override public void serialize(Object val, JsonGenerator gen, SerializerProvider ser) throws IOException { gen.writeString(""); @@ -111,11 +120,17 @@ public class GridJettyObjectMapper extends ObjectMapper { } /** {@inheritDoc} */ + @Override public JsonSerializer<Object> findNullKeySerializer(JavaType serializationType, + BeanProperty prop) throws JsonMappingException { + return NULL_KEY_SERIALIZER; + } + + /** {@inheritDoc} */ @Override public JsonSerializer<Object> findNullValueSerializer(BeanProperty prop) throws JsonMappingException { if (prop.getType().getRawClass() == String.class) - return NULL_STRING_SERIALIZER; + return NULL_STRING_VALUE_SERIALIZER; - return NULL_SERIALIZER; + return NULL_VALUE_SERIALIZER; } }
