Skip to content

Commit aed4c47

Browse files
committed
Polish CompositeHandlerExceptionResolver
See gh-31495
1 parent 3592292 commit aed4c47

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/CompositeHandlerExceptionResolver.java

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.List;
21-
import java.util.Objects;
2221

2322
import javax.servlet.http.HttpServletRequest;
2423
import javax.servlet.http.HttpServletResponse;
@@ -47,36 +46,45 @@ class CompositeHandlerExceptionResolver implements HandlerExceptionResolver {
4746
@Autowired
4847
private ListableBeanFactory beanFactory;
4948

50-
private List<HandlerExceptionResolver> resolvers;
49+
private transient List<HandlerExceptionResolver> resolvers;
5150

5251
@Override
5352
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
5453
Exception ex) {
55-
if (this.resolvers == null) {
56-
this.resolvers = extractResolvers();
54+
for (HandlerExceptionResolver resolver : getResolvers()) {
55+
ModelAndView resolved = resolver.resolveException(request, response, handler, ex);
56+
if (resolved != null) {
57+
return resolved;
58+
}
5759
}
58-
return this.resolvers.stream().map((resolver) -> resolver.resolveException(request, response, handler, ex))
59-
.filter(Objects::nonNull).findFirst().orElse(null);
60+
return null;
6061
}
6162

62-
private List<HandlerExceptionResolver> extractResolvers() {
63-
List<HandlerExceptionResolver> list = new ArrayList<>();
64-
BeanFactory beanFactory = this.beanFactory;
65-
while (beanFactory != null) {
66-
if (beanFactory instanceof ListableBeanFactory) {
67-
list.addAll(
68-
((ListableBeanFactory) beanFactory).getBeansOfType(HandlerExceptionResolver.class).values());
63+
private List<HandlerExceptionResolver> getResolvers() {
64+
List<HandlerExceptionResolver> resolvers = this.resolvers;
65+
if (resolvers == null) {
66+
resolvers = new ArrayList<>();
67+
collectResolverBeans(resolvers, this.beanFactory);
68+
resolvers.remove(this);
69+
AnnotationAwareOrderComparator.sort(resolvers);
70+
if (resolvers.isEmpty()) {
71+
resolvers.add(new DefaultErrorAttributes());
72+
resolvers.add(new DefaultHandlerExceptionResolver());
6973
}
70-
beanFactory = (beanFactory instanceof HierarchicalBeanFactory)
71-
? ((HierarchicalBeanFactory) beanFactory).getParentBeanFactory() : null;
74+
this.resolvers = resolvers;
75+
}
76+
return resolvers;
77+
}
78+
79+
private void collectResolverBeans(List<HandlerExceptionResolver> resolvers, BeanFactory beanFactory) {
80+
if (beanFactory instanceof ListableBeanFactory) {
81+
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
82+
resolvers.addAll(listableBeanFactory.getBeansOfType(HandlerExceptionResolver.class).values());
7283
}
73-
list.remove(this);
74-
AnnotationAwareOrderComparator.sort(list);
75-
if (list.isEmpty()) {
76-
list.add(new DefaultErrorAttributes());
77-
list.add(new DefaultHandlerExceptionResolver());
84+
if (beanFactory instanceof HierarchicalBeanFactory) {
85+
HierarchicalBeanFactory hierarchicalBeanFactory = (HierarchicalBeanFactory) beanFactory;
86+
collectResolverBeans(resolvers, hierarchicalBeanFactory.getParentBeanFactory());
7887
}
79-
return list;
8088
}
8189

8290
}

0 commit comments

Comments
 (0)