diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.java index 5c16f7f9db..8948605bd3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfiguration.java @@ -69,7 +69,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.expression.EvaluationContext; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; +import org.springframework.expression.spel.support.SimpleEvaluationContext; import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.View; @@ -304,10 +304,8 @@ public class ErrorMvcAutoConfiguration { } private EvaluationContext getContext(Map map) { - StandardEvaluationContext context = new StandardEvaluationContext(); - context.addPropertyAccessor(new MapAccessor()); - context.setRootObject(map); - return context; + return SimpleEvaluationContext.forPropertyAccessors(new MapAccessor()) + .withRootObject(map).build(); } @Override diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfigurationTests.java index 562b934057..21dc96fdaa 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/servlet/error/ErrorMvcAutoConfigurationTests.java @@ -45,12 +45,26 @@ public class ErrorMvcAutoConfigurationTests { public OutputCapture outputCapture = new OutputCapture(); @Test - public void testDefaultViewWithResponseAlreadyCommitted() { + public void renderContainsViewWithExceptionDetails() throws Exception { this.contextRunner.run((context) -> { View errorView = context.getBean("error", View.class); ErrorAttributes errorAttributes = context.getBean(ErrorAttributes.class); - DispatcherServletWebRequest webRequest = createCommittedWebRequest( - new IllegalStateException("Exception message")); + DispatcherServletWebRequest webRequest = createWebRequest( + new IllegalStateException("Exception message"), false); + errorView.render(errorAttributes.getErrorAttributes(webRequest, true), + webRequest.getRequest(), webRequest.getResponse()); + assertThat(((MockHttpServletResponse) webRequest.getResponse()) + .getContentAsString()).contains("
Exception message
"); + }); + } + + @Test + public void renderWhenAlreadyCommittedLogsMessage() { + this.contextRunner.run((context) -> { + View errorView = context.getBean("error", View.class); + ErrorAttributes errorAttributes = context.getBean(ErrorAttributes.class); + DispatcherServletWebRequest webRequest = createWebRequest( + new IllegalStateException("Exception message"), true); errorView.render(errorAttributes.getErrorAttributes(webRequest, true), webRequest.getRequest(), webRequest.getResponse()); assertThat(this.outputCapture.toString()) @@ -61,7 +75,8 @@ public class ErrorMvcAutoConfigurationTests { }); } - protected DispatcherServletWebRequest createCommittedWebRequest(Exception ex) { + private DispatcherServletWebRequest createWebRequest(Exception ex, + boolean committed) { MockHttpServletRequest request = new MockHttpServletRequest("GET", "/path"); MockHttpServletResponse response = new MockHttpServletResponse(); DispatcherServletWebRequest webRequest = new DispatcherServletWebRequest(request, @@ -70,9 +85,9 @@ public class ErrorMvcAutoConfigurationTests { RequestAttributes.SCOPE_REQUEST); webRequest.setAttribute("javax.servlet.error.request_uri", "/path", RequestAttributes.SCOPE_REQUEST); - response.setCommitted(true); - response.setOutputStreamAccessAllowed(false); - response.setWriterAccessAllowed(false); + response.setCommitted(committed); + response.setOutputStreamAccessAllowed(!committed); + response.setWriterAccessAllowed(!committed); return webRequest; }