Skip to content

Commit 257cc63

Browse files
committed
Restore order in AllEncompassingFormHttpMessageConverter
Issue: SPR-13309
1 parent 28a42d1 commit 257cc63

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

spring-web/src/main/java/org/springframework/http/converter/support/AllEncompassingFormHttpMessageConverter.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ public class AllEncompassingFormHttpMessageConverter extends FormHttpMessageConv
5353
public AllEncompassingFormHttpMessageConverter() {
5454
addPartConverter(new SourceHttpMessageConverter<Source>());
5555

56-
if (jackson2XmlPresent) {
57-
addPartConverter(new MappingJackson2XmlHttpMessageConverter());
58-
}
59-
else if (jaxb2Present) {
56+
if (jaxb2Present && !jackson2Present) {
6057
addPartConverter(new Jaxb2RootElementHttpMessageConverter());
6158
}
6259

@@ -66,6 +63,10 @@ else if (jaxb2Present) {
6663
else if (gsonPresent) {
6764
addPartConverter(new GsonHttpMessageConverter());
6865
}
66+
67+
if (jackson2XmlPresent) {
68+
addPartConverter(new MappingJackson2XmlHttpMessageConverter());
69+
}
6970
}
7071

7172
}

spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.io.StringReader;
2323
import java.nio.charset.Charset;
2424
import java.util.List;
25+
import javax.xml.bind.annotation.XmlElement;
26+
import javax.xml.bind.annotation.XmlRootElement;
2527
import javax.xml.transform.Source;
2628
import javax.xml.transform.stream.StreamSource;
2729

@@ -198,6 +200,47 @@ public String getFilename() {
198200
verify(outputMessage.getBody(), never()).close();
199201
}
200202

203+
// SPR-13309
204+
205+
@Test
206+
public void writeMultipartOrder() throws Exception {
207+
MyBean myBean = new MyBean();
208+
myBean.setString("foo");
209+
210+
MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>();
211+
parts.add("part1", myBean);
212+
213+
HttpHeaders entityHeaders = new HttpHeaders();
214+
entityHeaders.setContentType(MediaType.TEXT_XML);
215+
HttpEntity<MyBean> entity = new HttpEntity<MyBean>(myBean, entityHeaders);
216+
parts.add("part2", entity);
217+
218+
MockHttpOutputMessage outputMessage = new MockHttpOutputMessage();
219+
this.converter.setMultipartCharset(UTF_8);
220+
this.converter.write(parts, new MediaType("multipart", "form-data", UTF_8), outputMessage);
221+
222+
final MediaType contentType = outputMessage.getHeaders().getContentType();
223+
assertNotNull("No boundary found", contentType.getParameter("boundary"));
224+
225+
// see if Commons FileUpload can read what we wrote
226+
FileItemFactory fileItemFactory = new DiskFileItemFactory();
227+
FileUpload fileUpload = new FileUpload(fileItemFactory);
228+
RequestContext requestContext = new MockHttpOutputMessageRequestContext(outputMessage);
229+
List<FileItem> items = fileUpload.parseRequest(requestContext);
230+
assertEquals(2, items.size());
231+
232+
FileItem item = items.get(0);
233+
assertTrue(item.isFormField());
234+
assertEquals("part1", item.getFieldName());
235+
assertEquals("{\"string\":\"foo\"}", item.getString());
236+
237+
item = items.get(1);
238+
assertTrue(item.isFormField());
239+
assertEquals("part2", item.getFieldName());
240+
assertEquals("<MyBean><string>foo</string></MyBean>", item.getString());
241+
}
242+
243+
201244

202245
private static class MockHttpOutputMessageRequestContext implements RequestContext {
203246

@@ -233,4 +276,17 @@ public InputStream getInputStream() throws IOException {
233276
}
234277
}
235278

279+
public static class MyBean {
280+
281+
private String string;
282+
283+
public String getString() {
284+
return this.string;
285+
}
286+
287+
public void setString(String string) {
288+
this.string = string;
289+
}
290+
}
291+
236292
}

0 commit comments

Comments
 (0)