From efe5d075117fb06a6ccffb7e3406ab5844ebb986 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 29 Jan 2025 19:33:01 -0800 Subject: [PATCH] Add test for #4934, minor fix (#4940) --- .../databind/DeserializationContext.java | 4 +- .../databind/DeserializationContextTest.java | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/DeserializationContextTest.java diff --git a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java index 108d1966df..d435fe1052 100644 --- a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java +++ b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java @@ -1074,7 +1074,7 @@ public JsonNode readTree(JsonParser p) throws IOException { */ public T readTreeAsValue(JsonNode n, Class targetType) throws IOException { - if (n == null) { + if (n == null || n.isMissingNode()) { return null; } try (TreeTraversingParser p = _treeAsTokens(n)) { @@ -1098,7 +1098,7 @@ public T readTreeAsValue(JsonNode n, Class targetType) throws IOException */ public T readTreeAsValue(JsonNode n, JavaType targetType) throws IOException { - if (n == null) { + if (n == null || n.isMissingNode()) { return null; } try (TreeTraversingParser p = _treeAsTokens(n)) { diff --git a/src/test/java/com/fasterxml/jackson/databind/DeserializationContextTest.java b/src/test/java/com/fasterxml/jackson/databind/DeserializationContextTest.java new file mode 100644 index 0000000000..96fe5037fe --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/DeserializationContextTest.java @@ -0,0 +1,53 @@ +package com.fasterxml.jackson.databind; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import org.junit.jupiter.api.Test; + +public class DeserializationContextTest extends DatabindTestUtil +{ + private final ObjectMapper MAPPER = newJsonMapper(); + + static class Bean4934 { + public String value; + } + + // [databind#4934] + @Test + public void testTreeAsValueFromNulls() throws Exception + { + final JsonNodeFactory nodeF = MAPPER.getNodeFactory(); + try (JsonParser p = MAPPER.createParser("abc")) { + DeserializationContext ctxt = MAPPER.readerFor(String.class).createDeserializationContext(p); + + assertNull(ctxt.readTreeAsValue(nodeF.nullNode(), Boolean.class)); + assertEquals(Boolean.FALSE, ctxt.readTreeAsValue(nodeF.nullNode(), Boolean.TYPE)); + + // Only fixed in 2.19: + //assertNull(ctxt.readTreeAsValue(nodeF.nullNode(), Bean4934.class)); + + } + } + + // [databind#4934] + @Test + public void testTreeAsValueFromMissing() throws Exception + { + final JsonNodeFactory nodeF = MAPPER.getNodeFactory(); + try (JsonParser p = MAPPER.createParser("abc")) { + DeserializationContext ctxt = MAPPER.readerFor(String.class).createDeserializationContext(p); + + assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Boolean.class)); + // Absent becomes `null` for now as well + assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Boolean.TYPE)); + + // Only fixed in 2.19: + //assertNull(ctxt.readTreeAsValue(nodeF.missingNode(), Bean4934.class)); + } + } +}