Support decoding Mono in Jaxb2XmlDecoder

Issue: SPR-16759
This commit is contained in:
Sebastien Deleuze
2018-05-02 11:57:40 +02:00
parent 22edab852d
commit af0cb53742
3 changed files with 16 additions and 2 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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"),