Convert non-unicode input when reading w/ Jackson
This commit makes sure that Jackson-based message converters and decoders can deal with non-unicode input. It does so by reading non-unicode input messages with a InputStreamReader. This commit also adds additional tests forthe canRead/canWrite methods on both codecs and message converters. Closes: gh-25247
This commit is contained in:
@@ -91,7 +91,7 @@ public class Jackson2JsonDecoderTests extends AbstractDecoderTestCase<Jackson2Js
|
||||
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_XML));
|
||||
assertTrue(this.decoder.canDecode(forClass(Pojo.class),
|
||||
new MediaType("application", "json", StandardCharsets.UTF_8)));
|
||||
assertFalse(this.decoder.canDecode(forClass(Pojo.class),
|
||||
assertTrue(this.decoder.canDecode(forClass(Pojo.class),
|
||||
new MediaType("application", "json", StandardCharsets.ISO_8859_1)));
|
||||
|
||||
}
|
||||
@@ -239,6 +239,26 @@ public class Jackson2JsonDecoderTests extends AbstractDecoderTestCase<Jackson2Js
|
||||
null);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void decodeNonUnicode() {
|
||||
Flux<DataBuffer> input = Flux.concat(
|
||||
stringBuffer("{\"føø\":\"bår\"}", StandardCharsets.ISO_8859_1)
|
||||
);
|
||||
|
||||
testDecode(input, ResolvableType.forType(new ParameterizedTypeReference<Map<String, String>>() {
|
||||
}),
|
||||
step -> step.assertNext(o -> {
|
||||
assertTrue(o instanceof Map);
|
||||
Map<String, String> map = (Map<String, String>) o;
|
||||
assertEquals(1, map.size());
|
||||
assertEquals("bår", map.get("føø"));
|
||||
})
|
||||
.verifyComplete(),
|
||||
MediaType.parseMediaType("application/json; charset=iso-8859-1"),
|
||||
null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void decodeMonoNonUtf8Encoding() {
|
||||
Mono<DataBuffer> input = stringBuffer("{\"foo\":\"bar\"}", StandardCharsets.UTF_16);
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.http.codec.json;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -65,11 +64,6 @@ public class Jackson2SmileDecoderTests extends AbstractDecoderTestCase<Jackson2S
|
||||
|
||||
assertFalse(decoder.canDecode(forClass(String.class), null));
|
||||
assertFalse(decoder.canDecode(forClass(Pojo.class), APPLICATION_JSON));
|
||||
|
||||
assertTrue(this.decoder.canDecode(ResolvableType.forClass(Pojo.class),
|
||||
new MimeType("application", "x-jackson-smile", StandardCharsets.UTF_8)));
|
||||
assertFalse(this.decoder.canDecode(ResolvableType.forClass(Pojo.class),
|
||||
new MimeType("application", "x-jackson-smile", StandardCharsets.ISO_8859_1)));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,6 @@ package org.springframework.http.codec.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
@@ -71,11 +70,6 @@ public class Jackson2SmileEncoderTests extends AbstractEncoderTestCase<Jackson2S
|
||||
assertTrue(this.encoder.canEncode(pojoType, STREAM_SMILE_MIME_TYPE));
|
||||
assertTrue(this.encoder.canEncode(pojoType, null));
|
||||
|
||||
assertTrue(this.encoder.canEncode(ResolvableType.forClass(Pojo.class),
|
||||
new MimeType("application", "x-jackson-smile", StandardCharsets.UTF_8)));
|
||||
assertFalse(this.encoder.canEncode(ResolvableType.forClass(Pojo.class),
|
||||
new MimeType("application", "x-jackson-smile", StandardCharsets.ISO_8859_1)));
|
||||
|
||||
// SPR-15464
|
||||
assertTrue(this.encoder.canEncode(ResolvableType.NONE, null));
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.http.converter.json;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.Type;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -64,7 +65,7 @@ public class MappingJackson2HttpMessageConverterTests {
|
||||
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)));
|
||||
assertTrue(converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.ISO_8859_1)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -439,7 +440,7 @@ public class MappingJackson2HttpMessageConverterTests {
|
||||
@Test
|
||||
public void readWithNoDefaultConstructor() throws Exception {
|
||||
String body = "{\"property1\":\"foo\",\"property2\":\"bar\"}";
|
||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes("UTF-8"));
|
||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.UTF_8));
|
||||
inputMessage.getHeaders().setContentType(new MediaType("application", "json"));
|
||||
try {
|
||||
converter.read(BeanWithNoDefaultConstructor.class, inputMessage);
|
||||
@@ -451,6 +452,19 @@ public class MappingJackson2HttpMessageConverterTests {
|
||||
fail();
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void readNonUnicode() throws Exception {
|
||||
String body = "{\"føø\":\"bår\"}";
|
||||
Charset charset = StandardCharsets.ISO_8859_1;
|
||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(charset));
|
||||
inputMessage.getHeaders().setContentType(new MediaType("application", "json", charset));
|
||||
HashMap<String, Object> result = (HashMap<String, Object>) this.converter.read(HashMap.class, inputMessage);
|
||||
|
||||
assertEquals(1, result.size());
|
||||
assertEquals("bår", result.get("føø"));
|
||||
}
|
||||
|
||||
|
||||
interface MyInterface {
|
||||
|
||||
|
||||
@@ -49,8 +49,6 @@ 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
|
||||
@@ -58,8 +56,6 @@ 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
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package org.springframework.http.converter.xml;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonView;
|
||||
@@ -55,7 +56,7 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||
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)));
|
||||
assertTrue(converter.canRead(MyBean.class, new MediaType("text", "xml", StandardCharsets.ISO_8859_1)));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -194,6 +195,21 @@ public class MappingJackson2XmlHttpMessageConverterTests {
|
||||
this.converter.read(MyBean.class, inputMessage);
|
||||
}
|
||||
|
||||
@Test
|
||||
@SuppressWarnings("unchecked")
|
||||
public void readNonUnicode() throws Exception {
|
||||
String body = "<MyBean>" +
|
||||
"<string>føø bår</string>" +
|
||||
"</MyBean>";
|
||||
|
||||
Charset charset = StandardCharsets.ISO_8859_1;
|
||||
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(charset));
|
||||
inputMessage.getHeaders().setContentType(new MediaType("application", "xml", charset));
|
||||
MyBean result = (MyBean) converter.read(MyBean.class, inputMessage);
|
||||
assertEquals("føø bår", result.getString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static class MyBean {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user