Skip to content

Commit

Permalink
Consistently resolve exceptions for resources and handler functions
Browse files Browse the repository at this point in the history
Closes gh-33381
  • Loading branch information
jhoeller committed Sep 11, 2024
1 parent a044357 commit e9e5fee
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,36 +22,31 @@
import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.function.HandlerFunction;

/**
* Abstract base class for
* {@link org.springframework.web.servlet.HandlerExceptionResolver HandlerExceptionResolver}
* implementations that support handling exceptions from handlers of type {@link HandlerMethod}.
*
* @author Rossen Stoyanchev
* @author Juergen Hoeller
* @since 3.1
*/
public abstract class AbstractHandlerMethodExceptionResolver extends AbstractHandlerExceptionResolver {

/**
* Checks if the handler is a {@link HandlerMethod} or a {@link HandlerFunction}
* and then delegates to the base class implementation of {@code #shouldApplyTo(HttpServletRequest, Object)}
* passing the bean of the {@code HandlerMethod}. Otherwise, returns {@code false}.
* Checks if the handler is a {@link HandlerMethod} or the resolver has global exception
* handlers and then delegates to the base class implementation of {@code #shouldApplyTo}
* passing the bean of the {@code HandlerMethod} if necessary. Otherwise, returns {@code false}.
* @see HandlerMethod
* @see #hasGlobalExceptionHandlers()
*/
@Override
protected boolean shouldApplyTo(HttpServletRequest request, @Nullable Object handler) {
if (handler == null) {
return super.shouldApplyTo(request, null);
if (handler instanceof HandlerMethod handlerMethod) {
return super.shouldApplyTo(request, handlerMethod.getBean());
}
else if (handler instanceof HandlerMethod handlerMethod) {
handler = handlerMethod.getBean();
return super.shouldApplyTo(request, handler);
}
else if (handler instanceof HandlerFunction<?> handlerFunction) {
return super.shouldApplyTo(request, handlerFunction);
}
else if (hasGlobalExceptionHandlers() && hasHandlerMappings()) {
else if (handler == null || (hasGlobalExceptionHandlers() && hasHandlerMappings())) {
return super.shouldApplyTo(request, handler);
}
else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.function.HandlerFunction;
import org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
Expand Down Expand Up @@ -419,8 +420,13 @@ protected boolean hasGlobalExceptionHandlers() {

@Override
protected boolean shouldApplyTo(HttpServletRequest request, @Nullable Object handler) {
return (handler instanceof ResourceHttpRequestHandler ?
hasGlobalExceptionHandlers() : super.shouldApplyTo(request, handler));
if ((handler instanceof ResourceHttpRequestHandler || handler instanceof HandlerFunction) &&
hasGlobalExceptionHandlers() && !hasHandlerMappings()) {
return true; // apply to ResourceHttpRequestHandler and HandlerFunction by default
}
else {
return super.shouldApplyTo(request, handler);
}
}

/**
Expand Down

0 comments on commit e9e5fee

Please sign in to comment.