Use ResponseEntity Content-Type as producible media type

Issue: SPR-16172
This commit is contained in:
Rossen Stoyanchev
2017-11-10 15:05:03 -05:00
parent 780993ce75
commit 9a894ab61e
5 changed files with 77 additions and 10 deletions

View File

@@ -83,6 +83,8 @@ import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.lang.Nullable;
import org.springframework.mock.web.test.MockHttpServletRequest;
@@ -934,6 +936,26 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
assertEquals(404, response.getStatus());
}
@Test // SPR-16172
public void httpEntityWithContentType() throws Exception {
initServlet(wac -> {
RootBeanDefinition adapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
messageConverters.add(new MappingJackson2HttpMessageConverter());
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
adapterDef.getPropertyValues().add("messageConverters", messageConverters);
wac.registerBeanDefinition("handlerAdapter", adapterDef);
}, ResponseEntityController.class);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/test-entity");
MockHttpServletResponse response = new MockHttpServletResponse();
getServlet().service(request, response);
assertEquals(200, response.getStatus());
assertEquals("application/xml", response.getHeader("Content-Type"));
assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
"<testEntity><name>Foo Bar</name></testEntity>", response.getContentAsString());
}
@Test // SPR-6877
public void overlappingMessageConvertersRequestBody() throws Exception {
initServlet(wac -> {
@@ -3210,7 +3232,7 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
@Controller
public static class ResponseEntityController {
@RequestMapping(path = "/foo", method = RequestMethod.POST)
@PostMapping("/foo")
public ResponseEntity<String> foo(HttpEntity<byte[]> requestEntity) throws Exception {
assertNotNull(requestEntity);
assertEquals("MyValue", requestEntity.getHeaders().getFirst("MyRequestHeader"));
@@ -3222,12 +3244,12 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
return ResponseEntity.created(location).header("MyResponseHeader", "MyValue").body(body);
}
@RequestMapping(path = "/bar", method = RequestMethod.GET)
@GetMapping("/bar")
public ResponseEntity<Void> bar() {
return ResponseEntity.notFound().header("MyResponseHeader", "MyValue").build();
}
@RequestMapping(path = "/baz", method = RequestMethod.GET)
@GetMapping("/baz")
public ResponseEntity<String> baz() {
return ResponseEntity.ok().header("MyResponseHeader", "MyValue").body("body");
}
@@ -3237,10 +3259,32 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
return ResponseEntity.ok().header("h1", "v1").build();
}
@RequestMapping(path = "/stores", method = RequestMethod.GET)
@GetMapping("/stores")
public ResponseEntity<String> getResource() {
return ResponseEntity.ok().body("body");
}
@GetMapping("/test-entity")
public ResponseEntity<TestEntity> testEntity() {
TestEntity entity = new TestEntity();
entity.setName("Foo Bar");
return ResponseEntity.ok().contentType(MediaType.APPLICATION_XML).body(entity);
}
}
@XmlRootElement
static class TestEntity {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Controller