Fix #2566
diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x
index a5ee5a6..bff23bc 100644
--- a/release-notes/CREDITS-2.x
+++ b/release-notes/CREDITS-2.x
@@ -1012,3 +1012,8 @@
Stefan Wendt (stewe@github)
* Reported #2560: Check `WRAP_EXCEPTIONS` in `CollectionDeserializer.handleNonArray()`
(2.10.2)
+
+Greg Arakelian (arakelian@github)
+ * Reported #2566: `MissingNode.toString()` returns `null` (4 character token) instead
+ of empty string
+ (2.10.2)
diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x
index 832ab09..01146d4 100644
--- a/release-notes/VERSION-2.x
+++ b/release-notes/VERSION-2.x
@@ -15,7 +15,9 @@
#2560: Check `WRAP_EXCEPTIONS` in `CollectionDeserializer.handleNonArray()`
(reported by Stefan W)
#2564: Fix `IllegalArgumentException` on empty input collection for `ArrayBlockingQueue`
- (repoted, fix suggested by yamert89@github)
+ (reported, fix suggested by yamert89@github)
+#2566: `MissingNode.toString()` returns `null` (4 character token) instead of empty string
+ (reported by Greg A)
#2567: Incorrect target type for arrays when providing nulls and nulls are disabled
(reported by João G)
diff --git a/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java b/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
index 82da773..ea090f0 100644
--- a/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
+++ b/src/main/java/com/fasterxml/jackson/databind/node/BaseJsonNode.java
@@ -127,7 +127,7 @@
/*
/**********************************************************
- /* Std method overrides
+ /* Standard method overrides
/**********************************************************
*/
diff --git a/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java b/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
index 7827ee1..120b36c 100644
--- a/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
+++ b/src/main/java/com/fasterxml/jackson/databind/node/MissingNode.java
@@ -70,9 +70,15 @@
public double asDouble(double defaultValue);
public boolean asBoolean(boolean defaultValue);
*/
+
+ /*
+ /**********************************************************
+ /* Serialization: bit tricky as we don't really have a value
+ /**********************************************************
+ */
@Override
- public final void serialize(JsonGenerator jg, SerializerProvider provider)
+ public final void serialize(JsonGenerator g, SerializerProvider provider)
throws IOException, JsonProcessingException
{
/* Nothing to output... should we signal an error tho?
@@ -81,7 +87,7 @@
* cannot just omit a value as JSON Object field name may have
* been written out.
*/
- jg.writeNull();
+ g.writeNull();
}
@Override
@@ -91,21 +97,13 @@
{
g.writeNull();
}
-
- @Override
- public boolean equals(Object o)
- {
- /* Hmmh. Since there's just a singleton instance, this
- * fails in all cases but with identity comparison.
- * However: if this placeholder value was to be considered
- * similar to SQL NULL, it shouldn't even equal itself?
- * That might cause problems when dealing with collections
- * like Sets... so for now, let's let identity comparison
- * return true.
- */
- return (o == this);
- }
+ /*
+ /**********************************************************
+ /* Jackson 2.10 improvements for validation
+ /**********************************************************
+ */
+
@SuppressWarnings("unchecked")
@Override
public JsonNode require() {
@@ -122,4 +120,34 @@
public int hashCode() {
return JsonNodeType.MISSING.ordinal();
}
+
+ /*
+ /**********************************************************
+ /* Standard method overrides
+ /**********************************************************
+ */
+
+ // 10-Dec-2019, tatu: Bit tricky case, see [databind#2566], but seems
+ // best NOT to produce legit JSON.
+ @Override
+ public String toString() {
+ return "";
+ }
+
+ @Override
+ public String toPrettyString() {
+ return "";
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ /* Hmmh. Since there's just a singleton instance, this fails in all cases but with
+ * identity comparison. However: if this placeholder value was to be considered
+ * similar to SQL NULL, it shouldn't even equal itself?
+ * That might cause problems when dealing with collections like Sets...
+ * so for now, let's let identity comparison return true.
+ */
+ return (o == this);
+ }
}
diff --git a/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java b/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
index 01448ef..91c1f60 100644
--- a/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
+++ b/src/test/java/com/fasterxml/jackson/databind/node/TestMissingNode.java
@@ -16,7 +16,9 @@
assertEquals("", n.asText());
assertStandardEquals(n);
// 10-Dec-2018, tatu: With 2.10, should serialize same as via ObjectMapper/ObjectWriter
- assertEquals("null", n.toString());
+ // 10-Dec-2019, tatu: Surprise! No, this is not how it worked in 2.9, nor does it make
+ // sense... see [databind#2566] for details
+ assertEquals("", n.toString());
assertNodeNumbersForNonNumeric(n);