-
Notifications
You must be signed in to change notification settings - Fork 38.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ResponseStatusException thrown from exception handler methods is no longer respected #32538
Comments
Line 321 in 186e70c
private static Mono<HandlerResult> handleExceptionHandlerFailure(
ServerWebExchange exchange, Throwable exception, Throwable invocationEx,
ArrayList<Throwable> exceptions, InvocableHandlerMethod invocable) {
if (disconnectedClientHelper.checkAndLogClientDisconnectedException(invocationEx)) {
return Mono.empty();
}
// Any other than the original exception (or a cause) is unintended here,
// probably an accident (e.g. failed assertion or the like).
if (!exceptions.contains(invocationEx) && logger.isWarnEnabled()) {
// ☝️☝️ if exception is 500 and invocationEx from ExceptionHandler is 400, intend to respect 500 here?
logger.warn(exchange.getLogPrefix() + "Failure in @ExceptionHandler " + invocable, invocationEx);
}
return Mono.error(exception); // ignore invocationEx and return origin exception!
} Hmm maybe it's intended behavior from this 5f601ce commit? // Maybe we can fix it like this?
if (invocationEx != null && invocationEx instanceof ResponseStatusException) {
return Mono.error(invocationEx);
}
return Mono.error(exception); Maybe we can fix like above code, let's wait maintainer's opinion~! |
Also see spring-projects/spring-boot#40148 (comment) for another report of this. |
Before the change introduced in #32359, the following would happen:
I think this behavior is invalid and unintended for the following reasons:
Still, we can consider rolling back partially this change as this is disrupting applications in a maintenance release. But I do think that keeping this change around for Spring Framework 6.2 is a good choice. |
@mbanaszkiewicz-vonage @beytularedzheb Thanks for raising this issue. I discussed this with @rstoyanchev and we confirmed that the original behavior was invalid in the first place and that exception handlers are supposed to fully handle the exception or re-throw the original exception. I initially marked this as a bug for 6.1.x as I thought the the handling of exceptions in different phases was maybe a mistake, but it turns out this is by design in WebFlux and that we may consolidate things in the future. In the meantime, can you let us know whether returning a |
Hi @bclozel, @RestControllerAdvice
internal class RestControllerExceptionHandler {
@ExceptionHandler(ConstraintViolationException::class)
fun exceptionHandler(e: ConstraintViolationException): Mono<Throwable> {
return Mono.error(ResponseStatusException(HttpStatus.BAD_REQUEST, e.message, e))
}
} This should also work for the case you shared above: spring-projects/spring-boot#40148 (comment) I am closing my ticket. |
Hi,
After upgrading from spring boot 3.2.3 (spring framework 6.1.4) to 3.2.4 (spring framework 6.1.5) I noticed that the status code for some validated rest endpoints changed to status code 500 - Internal Server Error when validation errors occur.
For example prior to spring boot 3.2.4 with below exception handler I would get status code 400 but in 3.2.4 it returns 500.
I suspect that it could be due to this change: 5f601ce
The text was updated successfully, but these errors were encountered: