Commit 0fa1d0ef authored by Scott Frederick's avatar Scott Frederick

Handle bind exceptions in management context

This commit updates the logic for handling binding exceptions in the
management context when it is separate from the application context.
The changes allow the exception details to be visible to
DefaultErrorAttributes without causing the servlet container to
detect an error condition.

Fixes gh-21036
parent 3927bd81
...@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -25,6 +25,7 @@ import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.core.annotation.AnnotationAwareOrderComparator;
import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
...@@ -51,13 +52,8 @@ class CompositeHandlerExceptionResolver implements HandlerExceptionResolver { ...@@ -51,13 +52,8 @@ class CompositeHandlerExceptionResolver implements HandlerExceptionResolver {
if (this.resolvers == null) { if (this.resolvers == null) {
this.resolvers = extractResolvers(); this.resolvers = extractResolvers();
} }
ModelAndView resolved = this.resolvers.stream() return this.resolvers.stream().map((resolver) -> resolver.resolveException(request, response, handler, ex))
.map((resolver) -> resolver.resolveException(request, response, handler, ex)).filter(Objects::nonNull) .filter(Objects::nonNull).findFirst().orElse(null);
.findFirst().orElse(null);
if (resolved != null && resolved.isEmpty()) {
request.setAttribute("javax.servlet.error.exception", ex);
}
return resolved;
} }
private List<HandlerExceptionResolver> extractResolvers() { private List<HandlerExceptionResolver> extractResolvers() {
...@@ -66,6 +62,7 @@ class CompositeHandlerExceptionResolver implements HandlerExceptionResolver { ...@@ -66,6 +62,7 @@ class CompositeHandlerExceptionResolver implements HandlerExceptionResolver {
list.remove(this); list.remove(this);
AnnotationAwareOrderComparator.sort(list); AnnotationAwareOrderComparator.sort(list);
if (list.isEmpty()) { if (list.isEmpty()) {
list.add(new DefaultErrorAttributes());
list.add(new DefaultHandlerExceptionResolver()); list.add(new DefaultHandlerExceptionResolver());
} }
return list; return list;
......
...@@ -67,7 +67,6 @@ class CompositeHandlerExceptionResolverTests { ...@@ -67,7 +67,6 @@ class CompositeHandlerExceptionResolverTests {
ModelAndView resolved = resolver.resolveException(this.request, this.response, null, exception); ModelAndView resolved = resolver.resolveException(this.request, this.response, null, exception);
assertThat(resolved).isNotNull(); assertThat(resolved).isNotNull();
assertThat(resolved.isEmpty()).isTrue(); assertThat(resolved.isEmpty()).isTrue();
assertThat(this.request.getAttribute("javax.servlet.error.exception")).isSameAs(exception);
} }
private void load(Class<?>... configs) { private void load(Class<?>... configs) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment