Browse Source

Do not set exception attribute if response body is set

ResponseEntityExceptionHandler should not set the exception attribute
when there is a response body, and the response is fully handled.

Closes gh-31541
pull/32009/head
rstoyanchev 2 years ago
parent
commit
2593b60f2b
  1. 10
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java
  2. 14
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java

10
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 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.
@ -658,14 +658,14 @@ public abstract class ResponseEntityExceptionHandler implements MessageSourceAwa @@ -658,14 +658,14 @@ public abstract class ResponseEntityExceptionHandler implements MessageSourceAwa
}
}
if (statusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR)) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}
if (body == null && ex instanceof ErrorResponse errorResponse) {
body = errorResponse.updateAndGetBody(this.messageSource, LocaleContextHolder.getLocale());
}
if (statusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR) && body == null) {
request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
}
return createResponseEntity(body, headers, statusCode, request);
}

14
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandlerTests.java

@ -323,6 +323,15 @@ public class ResponseEntityExceptionHandlerTests { @@ -323,6 +323,15 @@ public class ResponseEntityExceptionHandlerTests {
testException(new MaxUploadSizeExceededException(1000));
}
@Test // gh-14287, gh-31541
void serverErrorWithoutBody() {
HttpStatusCode code = HttpStatusCode.valueOf(500);
Exception ex = new IllegalStateException("internal error");
this.exceptionHandler.handleExceptionInternal(ex, null, new HttpHeaders(), code, this.request);
assertThat(this.servletRequest.getAttribute("jakarta.servlet.error.exception")).isSameAs(ex);
}
@Test
public void controllerAdvice() throws Exception {
StaticWebApplicationContext ctx = new StaticWebApplicationContext();
@ -400,11 +409,6 @@ public class ResponseEntityExceptionHandlerTests { @@ -400,11 +409,6 @@ public class ResponseEntityExceptionHandlerTests {
ResponseEntity<Object> entity = this.exceptionHandler.handleException(ex, this.request);
assertThat(entity).isNotNull();
// SPR-9653
if (HttpStatus.INTERNAL_SERVER_ERROR.equals(entity.getStatusCode())) {
assertThat(this.servletRequest.getAttribute("jakarta.servlet.error.exception")).isSameAs(ex);
}
// Verify DefaultHandlerExceptionResolver would set the same status
this.exceptionResolver.resolveException(this.servletRequest, this.servletResponse, null, ex);
assertThat(entity.getStatusCode().value()).isEqualTo(this.servletResponse.getStatus());

Loading…
Cancel
Save