diff --git a/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java b/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java index bdee6478b12..c1e59b089f4 100644 --- a/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java +++ b/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/main/java/sample/SampleController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,10 @@ package sample; +import java.io.IOException; + +import javax.servlet.http.HttpServletResponse; + import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -27,4 +31,14 @@ public class SampleController { return "Hello World"; } + @RequestMapping("/send-error") + public void sendError(HttpServletResponse response) throws IOException { + response.sendError(500); + } + + @RequestMapping("/exception") + public void exception() { + throw new RuntimeException(); + } + } diff --git a/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java b/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java index 0a54c7c2067..a592caeaee9 100644 --- a/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java +++ b/spring-boot-deployment-tests/spring-boot-deployment-test-tomcat/src/test/java/sample/SampleTomcatDeployApplicationIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,14 @@ package sample; +import java.net.URI; + import org.junit.Test; import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import static org.assertj.core.api.Assertions.assertThat; @@ -29,15 +33,83 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class SampleTomcatDeployApplicationIT { + private final TestRestTemplate rest = new TestRestTemplate(); + private int port = Integer.valueOf(System.getProperty("port")); @Test public void testHome() throws Exception { String url = "http://localhost:" + this.port + "/bootapp/"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, - String.class); + ResponseEntity entity = this.rest.getForEntity(url, String.class); assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); assertThat(entity.getBody()).isEqualTo("Hello World"); } + @Test + public void errorFromExceptionForRequestAcceptingAnythingProducesAJsonResponse() + throws Exception { + assertThatErrorFromExceptionProducesExpectedResponse(MediaType.ALL, + MediaType.APPLICATION_JSON); + } + + @Test + public void errorFromExceptionForRequestAcceptingJsonProducesAJsonResponse() + throws Exception { + assertThatErrorFromExceptionProducesExpectedResponse(MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON); + } + + @Test + public void errorFromExceptionForRequestAcceptingHtmlProducesAnHtmlResponse() + throws Exception { + assertThatErrorFromExceptionProducesExpectedResponse(MediaType.TEXT_HTML, + MediaType.TEXT_HTML); + } + + @Test + public void sendErrorForRequestAcceptingAnythingProducesAJsonResponse() + throws Exception { + assertThatSendErrorProducesExpectedResponse(MediaType.ALL, + MediaType.APPLICATION_JSON); + } + + @Test + public void sendErrorForRequestAcceptingJsonProducesAJsonResponse() throws Exception { + assertThatSendErrorProducesExpectedResponse(MediaType.APPLICATION_JSON, + MediaType.APPLICATION_JSON); + } + + @Test + public void sendErrorForRequestAcceptingHtmlProducesAnHtmlResponse() + throws Exception { + assertThatSendErrorProducesExpectedResponse(MediaType.TEXT_HTML, + MediaType.TEXT_HTML); + } + + private void assertThatSendErrorProducesExpectedResponse(MediaType accept, + MediaType contentType) { + RequestEntity request = RequestEntity + .get(URI.create("http://localhost:" + this.port + "/bootapp/send-error")) + .accept(accept).build(); + ResponseEntity response = this.rest.exchange(request, String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(contentType.isCompatibleWith(response.getHeaders().getContentType())) + .as("%s is compatible with %s", contentType, + response.getHeaders().getContentType()) + .isTrue(); + } + + private void assertThatErrorFromExceptionProducesExpectedResponse(MediaType accept, + MediaType contentType) { + RequestEntity request = RequestEntity + .get(URI.create("http://localhost:" + this.port + "/bootapp/exception")) + .accept(accept).build(); + ResponseEntity response = this.rest.exchange(request, String.class); + assertThat(response.getStatusCode()).isEqualTo(HttpStatus.INTERNAL_SERVER_ERROR); + assertThat(contentType.isCompatibleWith(response.getHeaders().getContentType())) + .as("%s is compatible with %s", contentType, + response.getHeaders().getContentType()) + .isTrue(); + } + } diff --git a/spring-boot/src/main/java/org/springframework/boot/web/support/ErrorPageFilter.java b/spring-boot/src/main/java/org/springframework/boot/web/support/ErrorPageFilter.java index 44663914017..b1f58789c3e 100644 --- a/spring-boot/src/main/java/org/springframework/boot/web/support/ErrorPageFilter.java +++ b/spring-boot/src/main/java/org/springframework/boot/web/support/ErrorPageFilter.java @@ -181,7 +181,7 @@ public class ErrorPageFilter implements Filter, ErrorPageRegistry { request.setAttribute(ERROR_EXCEPTION, ex); request.setAttribute(ERROR_EXCEPTION_TYPE, ex.getClass()); response.reset(); - response.sendError(500, ex.getMessage()); + response.setStatus(500); request.getRequestDispatcher(path).forward(request, response); request.removeAttribute(ERROR_EXCEPTION); request.removeAttribute(ERROR_EXCEPTION_TYPE);