Skip to content

Commit b55f69d

Browse files
committed
Support decoding Mono in Jaxb2XmlDecoder
Issue: SPR-16759
1 parent de1eb34 commit b55f69d

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

spring-web/src/main/java/org/springframework/http/codec/xml/Jaxb2XmlDecoder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType ele
107107
return splitEvents.map(events -> unmarshal(events, outputClass));
108108
}
109109

110+
@Override
111+
public Mono<Object> decodeToMono(Publisher<DataBuffer> inputStream, ResolvableType elementType,
112+
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
113+
return decode(inputStream, elementType, mimeType, hints).singleOrEmpty();
114+
}
115+
110116
private Object unmarshal(List<XMLEvent> events, Class<?> outputClass) {
111117
try {
112118
Unmarshaller unmarshaller = this.jaxbContexts.createUnmarshaller(outputClass);

spring-web/src/test/java/org/springframework/http/codec/xml/Jaxb2XmlDecoderTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.junit.Test;
2525
import reactor.core.publisher.Flux;
26+
import reactor.core.publisher.Mono;
2627
import reactor.test.StepVerifier;
2728

2829
import org.springframework.core.ResolvableType;
@@ -159,7 +160,7 @@ private static void assertCharacters(XMLEvent event, String expectedData) {
159160
@Test
160161
public void decodeSingleXmlRootElement() throws Exception {
161162
Flux<DataBuffer> source = Flux.just(stringBuffer(POJO_ROOT));
162-
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(Pojo.class),
163+
Mono<Object> output = this.decoder.decodeToMono(source, ResolvableType.forClass(Pojo.class),
163164
null, Collections.emptyMap());
164165

165166
StepVerifier.create(output)
@@ -171,7 +172,7 @@ public void decodeSingleXmlRootElement() throws Exception {
171172
@Test
172173
public void decodeSingleXmlTypeElement() throws Exception {
173174
Flux<DataBuffer> source = Flux.just(stringBuffer(POJO_ROOT));
174-
Flux<Object> output = this.decoder.decode(source, ResolvableType.forClass(TypePojo.class),
175+
Mono<Object> output = this.decoder.decodeToMono(source, ResolvableType.forClass(TypePojo.class),
175176
null, Collections.emptyMap());
176177

177178
StepVerifier.create(output)

spring-webflux/src/test/java/org/springframework/web/reactive/result/method/annotation/RequestMappingMessageConversionIntegrationTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,13 @@ public void personTransformWithMono() throws Exception {
227227
JSON, Person.class).getBody());
228228
}
229229

230+
@Test // SPR-16759
231+
public void personTransformWithMonoAndXml() throws Exception {
232+
assertEquals(new Person("ROBERT"),
233+
performPost("/person-transform/mono", MediaType.APPLICATION_XML, new Person("Robert"),
234+
MediaType.APPLICATION_XML, Person.class).getBody());
235+
}
236+
230237
@Test
231238
public void personTransformWithSingle() throws Exception {
232239
assertEquals(new Person("ROBERT"),

0 commit comments

Comments
 (0)