From 9077a58a1325a4e5e610c13849b3509e8cd88111 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 7 Dec 2013 20:58:58 -0800 Subject: Fix #362 --- .../fasterxml/jackson/databind/ser/std/UUIDSerializer.java | 12 ++++++++++-- .../com/fasterxml/jackson/databind/ser/TestJdkTypes.java | 6 +++++- .../com/fasterxml/jackson/databind/util/TestTokenBuffer.java | 8 ++++---- 3 files changed, 19 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/UUIDSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/UUIDSerializer.java index c59c8053d..e4f239b53 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/UUIDSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/UUIDSerializer.java @@ -6,6 +6,7 @@ import java.util.UUID; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.util.TokenBuffer; /** * Specialized {@link JsonSerializer} to output {@link java.util.UUID}s. @@ -41,8 +42,15 @@ public class UUIDSerializer { // First: perhaps we could serialize it as raw binary data? if (jgen.canWriteBinaryNatively()) { - jgen.writeBinary(_asBytes(value)); - return; + /* 07-Dec-2013, tatu: One nasty case; that of TokenBuffer. While it can + * technically retain binary data, we do not want to do use binary + * with it, as that results in UUIDs getting converted to Base64 for + * most conversions. + */ + if (!(jgen instanceof TokenBuffer)) { + jgen.writeBinary(_asBytes(value)); + return; + } } // UUID.toString() works ok functionally, but we can make it go much faster diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/TestJdkTypes.java b/src/test/java/com/fasterxml/jackson/databind/ser/TestJdkTypes.java index 98d264fe8..79865449d 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/TestJdkTypes.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/TestJdkTypes.java @@ -18,7 +18,7 @@ import com.fasterxml.jackson.databind.*; public class TestJdkTypes extends com.fasterxml.jackson.databind.BaseMapTest { - private final ObjectMapper MAPPER = new ObjectMapper(); + private final ObjectMapper MAPPER = objectMapper(); /** * Unit test to catch bug [JACKSON-8]. @@ -144,6 +144,10 @@ public class TestJdkTypes UUID uuid = UUID.fromString(value); String json = MAPPER.writeValueAsString(uuid); assertEquals(quote(uuid.toString()), json); + + // Also, wrt [#362], should convert cleanly + String str = MAPPER.convertValue(uuid, String.class); + assertEquals(value, str); } // then use templating; note that these are not exactly valid UUIDs diff --git a/src/test/java/com/fasterxml/jackson/databind/util/TestTokenBuffer.java b/src/test/java/com/fasterxml/jackson/databind/util/TestTokenBuffer.java index e01bec68e..1e9b566d7 100644 --- a/src/test/java/com/fasterxml/jackson/databind/util/TestTokenBuffer.java +++ b/src/test/java/com/fasterxml/jackson/databind/util/TestTokenBuffer.java @@ -237,11 +237,11 @@ public class TestTokenBuffer extends com.fasterxml.jackson.test.BaseTest UUID out = mapper.readValue(buf.asParser(), UUID.class); assertEquals(uuid.toString(), out.toString()); - // second part: ensure it's written as binary... + // second part: As per [#362], should NOT use binary with TokenBuffer JsonParser jp = buf.asParser(); - assertEquals(JsonToken.VALUE_EMBEDDED_OBJECT, jp.nextToken()); - byte[] raw = jp.getBinaryValue(); - assertEquals(16, raw.length); + assertEquals(JsonToken.VALUE_STRING, jp.nextToken()); + String str = jp.getText(); + assertEquals(value, str); jp.close(); } } -- cgit v1.2.3