Produces media types cleared prior to error handling

Issue: SPR-16318
This commit is contained in:
Rossen Stoyanchev
2018-05-14 14:41:19 -04:00
parent b3b233b43a
commit 395792b302
4 changed files with 77 additions and 6 deletions

View File

@@ -1121,7 +1121,22 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
@Test
public void produces() throws Exception {
initServletWithControllers(ProducesController.class);
initServlet(wac -> {
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new Jaxb2RootElementHttpMessageConverter());
RootBeanDefinition beanDef;
beanDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class);
beanDef.getPropertyValues().add("messageConverters", converters);
wac.registerBeanDefinition("handlerAdapter", beanDef);
beanDef = new RootBeanDefinition(ExceptionHandlerExceptionResolver.class);
beanDef.getPropertyValues().add("messageConverters", converters);
wac.registerBeanDefinition("requestMappingResolver", beanDef);
}, ProducesController.class);
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/something");
request.addHeader("Accept", "text/html");
@@ -1152,6 +1167,15 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
response = new MockHttpServletResponse();
getServlet().service(request, response);
assertEquals(406, response.getStatus());
// SPR-16318
request = new MockHttpServletRequest("GET", "/something");
request.addHeader("Accept", "text/csv,application/problem+json");
response = new MockHttpServletResponse();
getServlet().service(request, response);
assertEquals(500, response.getStatus());
assertEquals("application/problem+json;charset=UTF-8", response.getContentType());
assertEquals("{\"reason\":\"error\"}", response.getContentAsString());
}
@Test
@@ -3000,15 +3024,25 @@ public class ServletAnnotationControllerHandlerMethodTests extends AbstractServl
@Controller
public static class ProducesController {
@RequestMapping(value = "/something", produces = "text/html")
@GetMapping(path = "/something", produces = "text/html")
public void handleHtml(Writer writer) throws IOException {
writer.write("html");
}
@RequestMapping(value = "/something", produces = "application/xml")
@GetMapping(path = "/something", produces = "application/xml")
public void handleXml(Writer writer) throws IOException {
writer.write("xml");
}
@GetMapping(path = "/something", produces = "text/csv")
public String handleCsv() {
throw new IllegalArgumentException();
}
@ExceptionHandler
public ResponseEntity<Map<String, String>> handle(IllegalArgumentException ex) {
return ResponseEntity.status(500).body(Collections.singletonMap("reason", "error"));
}
}
@Controller