Respect MediaType charset in Jackson converters

Before this commit, AbstractJackson2HttpMessageConverter and subclasses
did not check media type encoding in the canRead and canWrite
methods. As a result, the converter reported that it can write
(for instance) "application/json;charset=ISO-8859-1", but in practice
wrote the default charset (UTF-8).

This commit fixes that bug.

See: gh-25076
This commit is contained in:
Arjen Poutsma
2020-06-04 17:32:06 +02:00
parent 70a2219fac
commit d9c98801bc
4 changed files with 50 additions and 4 deletions

View File

@@ -63,12 +63,16 @@ public class MappingJackson2HttpMessageConverterTests {
public void canRead() {
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "json")));
assertTrue(converter.canRead(Map.class, new MediaType("application", "json")));
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.UTF_8)));
assertFalse(converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.ISO_8859_1)));
}
@Test
public void canWrite() {
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "json")));
assertTrue(converter.canWrite(Map.class, new MediaType("application", "json")));
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "json", StandardCharsets.UTF_8)));
assertFalse(converter.canWrite(MyBean.class, new MediaType("application", "json", StandardCharsets.ISO_8859_1)));
}
@Test // SPR-7905

View File

@@ -49,6 +49,8 @@ public class MappingJackson2SmileHttpMessageConverterTests {
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "x-jackson-smile")));
assertFalse(converter.canRead(MyBean.class, new MediaType("application", "json")));
assertFalse(converter.canRead(MyBean.class, new MediaType("application", "xml")));
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "x-jackson-smile", StandardCharsets.UTF_8)));
assertFalse(converter.canRead(MyBean.class, new MediaType("application", "x-jackson-smile", StandardCharsets.ISO_8859_1)));
}
@Test
@@ -56,6 +58,8 @@ public class MappingJackson2SmileHttpMessageConverterTests {
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "x-jackson-smile")));
assertFalse(converter.canWrite(MyBean.class, new MediaType("application", "json")));
assertFalse(converter.canWrite(MyBean.class, new MediaType("application", "xml")));
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "x-jackson-smile", StandardCharsets.UTF_8)));
assertFalse(converter.canWrite(MyBean.class, new MediaType("application", "x-jackson-smile", StandardCharsets.ISO_8859_1)));
}
@Test

View File

@@ -54,6 +54,8 @@ public class MappingJackson2XmlHttpMessageConverterTests {
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "xml")));
assertTrue(converter.canRead(MyBean.class, new MediaType("text", "xml")));
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "soap+xml")));
assertTrue(converter.canRead(MyBean.class, new MediaType("text", "xml", StandardCharsets.UTF_8)));
assertFalse(converter.canRead(MyBean.class, new MediaType("text", "xml", StandardCharsets.ISO_8859_1)));
}
@Test
@@ -61,6 +63,8 @@ public class MappingJackson2XmlHttpMessageConverterTests {
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "xml")));
assertTrue(converter.canWrite(MyBean.class, new MediaType("text", "xml")));
assertTrue(converter.canWrite(MyBean.class, new MediaType("application", "soap+xml")));
assertTrue(converter.canWrite(MyBean.class, new MediaType("text", "xml", StandardCharsets.UTF_8)));
assertFalse(converter.canWrite(MyBean.class, new MediaType("text", "xml", StandardCharsets.ISO_8859_1)));
}
@Test