diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 32c2069a2c..89059dff8e 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -10,6 +10,8 @@ Project: jackson-databind of type `UnwrappingBeanSerializer` (reported by Petar T) #2082: `FactoryBasedEnumDeserializer` should be cachable +#2096: `TreeTraversingParser` does not take base64 variant into account + (reported by tangiel@github) #2109: Canonical string for reference type is built incorrectly (reported by svarzee@github) diff --git a/src/main/java/com/fasterxml/jackson/databind/node/TreeTraversingParser.java b/src/main/java/com/fasterxml/jackson/databind/node/TreeTraversingParser.java index aa3f3090bb..40bf3d3435 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/TreeTraversingParser.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/TreeTraversingParser.java @@ -357,19 +357,13 @@ public byte[] getBinaryValue(Base64Variant b64variant) { // Multiple possibilities... JsonNode n = currentNode(); - if (n != null) { // binary node? - byte[] data = n.binaryValue(); - // (or TextNode, which can also convert automatically!) - if (data != null) { - return data; - } - // Or maybe byte[] as POJO? - if (n.isPojo()) { - Object ob = ((POJONode) n).getPojo(); - if (ob instanceof byte[]) { - return (byte[]) ob; - } + if (n != null) { + // [databind#2096]: although `binaryValue()` works for real binary node + // and embedded "POJO" node, coercion from TextNode may require variant, so: + if (n instanceof TextNode) { + return ((TextNode) n).getBinaryValue(b64variant); } + return n.binaryValue(); } // otherwise return null to mark we have no binary content return null; diff --git a/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java b/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java index fedf874c84..e22082d58c 100644 --- a/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java +++ b/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java @@ -175,10 +175,22 @@ public void testBase64Text() throws Exception try { data = n.getBinaryValue(variant); } catch (Exception e) { - throw new IOException("Failed (variant "+variant+", data length "+len+"): "+e.getMessage()); + fail("Failed (variant "+variant+", data length "+len+"): "+e.getMessage()); } assertNotNull(data); assertArrayEquals(data, input); + + // 15-Aug-2018, tatu: [databind#2096] requires another test + JsonParser p = new TreeTraversingParser(n); + assertEquals(JsonToken.VALUE_STRING, p.nextToken()); + try { + data = p.getBinaryValue(variant); + } catch (Exception e) { + fail("Failed (variant "+variant+", data length "+len+"): "+e.getMessage()); + } + assertNotNull(data); + assertArrayEquals(data, input); + p.close(); } } }