Skip to content

Commit 65d0ad7

Browse files
committed
Merge branch '2.13' into 2.14
2 parents d99dc22 + 31563dd commit 65d0ad7

File tree

3 files changed

+47
-3
lines changed

3 files changed

+47
-3
lines changed

release-notes/VERSION-2.x

+6-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,12 @@ Project: jackson-databind
1717

1818
2.13.3 (not yet released)
1919

20-
...
20+
#3446: `java.lang.StringBuffer` cannot be deserialized
21+
(reported by Lolf1010@github)
22+
23+
2.13.2.2 (28-Mar-2022)
24+
25+
No changes since 2.13.2.1 but fixed Gradle Module Metadata ("module.json")
2126

2227
2.13.2.1 (24-Mar-2022)
2328

src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java

+35-2
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public static Class<?>[] types() {
7474

7575
// Special impl:
7676
StringBuilder.class,
77+
StringBuffer.class, // since 2.13.3
7778
};
7879
}
7980

@@ -120,6 +121,8 @@ public static FromStringDeserializer<?> findDeserializer(Class<?> rawType)
120121
kind = Std.STD_INET_SOCKET_ADDRESS;
121122
} else if (rawType == StringBuilder.class) {
122123
return new StringBuilderDeserializer();
124+
} else if (rawType == StringBuffer.class) { // since 2.13.3
125+
return new StringBufferDeserializer();
123126
} else {
124127
return null;
125128
}
@@ -465,9 +468,8 @@ private Locale _deSerializeBCP47Locale(String value, int ix, String first, Strin
465468
}
466469
}
467470
}
468-
471+
469472
// @since 2.12 to simplify logic a bit: should not use coercions when reading
470-
// String Values
471473
static class StringBuilderDeserializer extends FromStringDeserializer<Object>
472474
{
473475
public StringBuilderDeserializer() {
@@ -503,4 +505,35 @@ protected Object _deserialize(String value, DeserializationContext ctxt)
503505
return new StringBuilder(value);
504506
}
505507
}
508+
509+
// @since 2.13.3: duplicated code but for only 2 impls base class seems unnecessary
510+
static class StringBufferDeserializer extends FromStringDeserializer<Object>
511+
{
512+
public StringBufferDeserializer() { super(StringBuffer.class); }
513+
514+
@Override
515+
public LogicalType logicalType() { return LogicalType.Textual; }
516+
517+
@Override
518+
public Object getEmptyValue(DeserializationContext ctxt) {
519+
return new StringBuffer();
520+
}
521+
522+
@Override
523+
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
524+
{
525+
String text = p.getValueAsString();
526+
if (text != null) {
527+
return _deserialize(text, ctxt);
528+
}
529+
return super.deserialize(p, ctxt);
530+
}
531+
532+
@Override
533+
protected Object _deserialize(String value, DeserializationContext ctxt)
534+
throws IOException
535+
{
536+
return new StringBuffer(value);
537+
}
538+
}
506539
}

src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKStringLikeTypeDeserTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ public void testStringBuilder() throws Exception
256256
assertEquals("abc", sb.toString());
257257
}
258258

259+
public void testStringBuffer() throws Exception
260+
{
261+
StringBuffer sb = MAPPER.readValue(q("abc"), StringBuffer.class);
262+
assertEquals("abc", sb.toString());
263+
}
264+
259265
public void testURI() throws Exception
260266
{
261267
final ObjectReader reader = MAPPER.readerFor(URI.class);

0 commit comments

Comments
 (0)