Support decoding Mono in Jaxb2XmlDecoder

Issue: SPR-16759
master
Sebastien Deleuze 6 years ago
parent 22edab852d
commit af0cb53742
  1. 6
      spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlDecoder.java
  2. 5
      spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlDecoderTests.java
  3. 7
      spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java

@ -107,6 +107,12 @@ public class Jaxb2XmlDecoder extends AbstractDecoder<Object> {
return splitEvents.map(events -> unmarshal(events, outputClass));
}
@Override
public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
return decode(inputStream, elementType, mimeType, hints).singleOrEmpty();
}
private Object unmarshal(List<XMLEvent> events, Class<?> outputClass) {
try {
Unmarshaller unmarshaller = this.jaxbContexts.createUnmarshaller(outputClass);

@ -23,6 +23,7 @@ import javax.xml.stream.events.XMLEvent;
import org.junit.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import org.springframework.core.ResolvableType;
@ -159,7 +160,7 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
@Test
public void decodeSingleXmlRootElement() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer(POJO_ROOT));
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(Pojo.class),
Mono<Object> output = this.decoder.decodeToMono(source, ResolvableType.forClass(Pojo.class),
null, Collections.emptyMap());
StepVerifier.create(output)
@ -171,7 +172,7 @@ public class Jaxb2XmlDecoderTests extends AbstractDataBufferAllocatingTestCase {
@Test
public void decodeSingleXmlTypeElement() throws Exception {
Flux<DataBuffer> source = Flux.just(stringBuffer(POJO_ROOT));
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(TypePojo.class),
Mono<Object> output = this.decoder.decodeToMono(source, ResolvableType.forClass(TypePojo.class),
null, Collections.emptyMap());
StepVerifier.create(output)

@ -227,6 +227,13 @@ public class RequestMappingMessageConversionIntegrationTests extends AbstractReq
JSON, Person.class).getBody());
}
@Test // SPR-16759
public void personTransformWithMonoAndXml() throws Exception {
assertEquals(new Person("ROBERT"),
performPost("/person-transform/mono", MediaType.APPLICATION_XML, new Person("Robert"),
MediaType.APPLICATION_XML, Person.class).getBody());
}
@Test
public void personTransformWithSingle() throws Exception {
assertEquals(new Person("ROBERT"),

Loading…
Cancel
Save