diff --git a/spring-web/src/main/java/org/springframework/web/ErrorResponse.java b/spring-web/src/main/java/org/springframework/web/ErrorResponse.java index f5e859729d..b47ba2f0d4 100644 --- a/spring-web/src/main/java/org/springframework/web/ErrorResponse.java +++ b/spring-web/src/main/java/org/springframework/web/ErrorResponse.java @@ -61,6 +61,11 @@ public interface ErrorResponse { * Return the body for the response, formatted as an RFC 9457 * {@link ProblemDetail} whose {@link ProblemDetail#getStatus() status} * should match the response status. + *
Note: The returned {@code ProblemDetail} may be + * updated before the response is rendered, e.g. via + * {@link #updateAndGetBody(MessageSource, Locale)}. Therefore, implementing + * methods should use an instance field, and should not re-create the + * {@code ProblemDetail} on every call, nor use a static variable. */ ProblemDetail getBody(); diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncRequestTimeoutException.java b/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncRequestTimeoutException.java index 100dd59303..ea0e57f608 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncRequestTimeoutException.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/AsyncRequestTimeoutException.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 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. @@ -37,6 +37,9 @@ import org.springframework.web.ErrorResponse; @SuppressWarnings("serial") public class AsyncRequestTimeoutException extends RuntimeException implements ErrorResponse { + private final ProblemDetail body = ProblemDetail.forStatus(getStatusCode()); + + @Override public HttpStatusCode getStatusCode() { return HttpStatus.SERVICE_UNAVAILABLE; @@ -44,7 +47,7 @@ public class AsyncRequestTimeoutException extends RuntimeException implements Er @Override public ProblemDetail getBody() { - return ProblemDetail.forStatus(getStatusCode()); + return this.body; } } diff --git a/spring-web/src/main/java/org/springframework/web/multipart/MaxUploadSizeExceededException.java b/spring-web/src/main/java/org/springframework/web/multipart/MaxUploadSizeExceededException.java index f781b7ef6e..5ccdf47278 100644 --- a/spring-web/src/main/java/org/springframework/web/multipart/MaxUploadSizeExceededException.java +++ b/spring-web/src/main/java/org/springframework/web/multipart/MaxUploadSizeExceededException.java @@ -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. @@ -33,10 +33,9 @@ import org.springframework.web.ErrorResponse; @SuppressWarnings("serial") public class MaxUploadSizeExceededException extends MultipartException implements ErrorResponse { - private static final ProblemDetail body = + private final ProblemDetail body = ProblemDetail.forStatusAndDetail(HttpStatus.PAYLOAD_TOO_LARGE, "Maximum upload size exceeded"); - private final long maxUploadSize; @@ -76,7 +75,7 @@ public class MaxUploadSizeExceededException extends MultipartException implement @Override public ProblemDetail getBody() { - return body; + return this.body; } }