Browse Source

Support reading unresolvable types in AbstractJacksonHttpMessageConverter

Closes gh-35889
pull/35899/head
Sébastien Deleuze 3 weeks ago
parent
commit
85ca9f46dd
  1. 6
      spring-web/src/main/java/org/springframework/http/converter/AbstractJacksonHttpMessageConverter.java
  2. 27
      spring-web/src/test/java/org/springframework/http/converter/json/JacksonJsonHttpMessageConverterTests.java

6
spring-web/src/main/java/org/springframework/http/converter/AbstractJacksonHttpMessageConverter.java

@ -264,11 +264,7 @@ public abstract class AbstractJacksonHttpMessageConverter<T extends ObjectMapper @@ -264,11 +264,7 @@ public abstract class AbstractJacksonHttpMessageConverter<T extends ObjectMapper
if (!canRead(mediaType)) {
return false;
}
Class<?> clazz = type.resolve();
if (clazz == null) {
return false;
}
return this.mapperRegistrations == null || selectMapper(clazz, mediaType) != null;
return this.mapperRegistrations == null || selectMapper(type.toClass(), mediaType) != null;
}
@Override

27
spring-web/src/test/java/org/springframework/http/converter/json/JacksonJsonHttpMessageConverterTests.java

@ -48,6 +48,7 @@ import tools.jackson.databind.ser.std.SimpleFilterProvider; @@ -48,6 +48,7 @@ import tools.jackson.databind.ser.std.SimpleFilterProvider;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ResolvableType;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.testfixture.http.MockHttpInputMessage;
import org.springframework.web.testfixture.http.MockHttpOutputMessage;
@ -67,6 +68,8 @@ class JacksonJsonHttpMessageConverterTests { @@ -67,6 +68,8 @@ class JacksonJsonHttpMessageConverterTests {
private JacksonJsonHttpMessageConverter converter = new JacksonJsonHttpMessageConverter();
private final ResolvableType unresolvableType = ResolvableType.forClass(ResponseEntity.class).getNested(2);
@Test
void canRead() {
@ -75,6 +78,7 @@ class JacksonJsonHttpMessageConverterTests { @@ -75,6 +78,7 @@ class JacksonJsonHttpMessageConverterTests {
assertThat(this.converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.UTF_8))).isTrue();
assertThat(this.converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.US_ASCII))).isTrue();
assertThat(this.converter.canRead(MyBean.class, new MediaType("application", "json", StandardCharsets.ISO_8859_1))).isTrue();
assertThat(this.converter.canRead(this.unresolvableType, MediaType.APPLICATION_JSON)).isTrue();
}
@Test
@ -173,6 +177,29 @@ class JacksonJsonHttpMessageConverterTests { @@ -173,6 +177,29 @@ class JacksonJsonHttpMessageConverterTests {
assertThat(result).containsEntry("bool", Boolean.TRUE);
assertThat(result).containsEntry("bytes", "AQI=");
}
@Test
@SuppressWarnings("unchecked")
void readUnresolable() throws IOException {
String body = "{" +
"\"bytes\":\"AQI=\"," +
"\"array\":[\"Foo\",\"Bar\"]," +
"\"number\":42," +
"\"string\":\"Foo\"," +
"\"bool\":true," +
"\"fraction\":42.0}";
MockHttpInputMessage inputMessage = new MockHttpInputMessage(body.getBytes(StandardCharsets.UTF_8));
inputMessage.getHeaders().setContentType(new MediaType("application", "json"));
HashMap<String, Object> result = (HashMap<String, Object>) this.converter.read(this.unresolvableType, inputMessage, null);
assertThat(result).containsEntry("string", "Foo");
assertThat(result).containsEntry("number", 42);
assertThat((Double) result.get("fraction")).isCloseTo(42D, within(0D));
List<String> array = new ArrayList<>();
array.add("Foo");
array.add("Bar");
assertThat(result).containsEntry("array", array);
assertThat(result).containsEntry("bool", Boolean.TRUE);
assertThat(result).containsEntry("bytes", "AQI=");
}
@Test
void write() throws IOException {

Loading…
Cancel
Save