Leverage ObjectProvider instead of autowired containers
In order to be able to leverage WebFlux configuration in a functional way, WebHttpHandlerBuilder and RouterFunctionMapping should leverage new ObjectProvider capabilities to get a sorted list of beans by type instead of using autowired containers. Issue: SPR-17327
This commit is contained in:
@@ -18,13 +18,11 @@ package org.springframework.web.server.adapter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.ApplicationContext;
|
||||
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
|
||||
import org.springframework.http.codec.ServerCodecConfigurer;
|
||||
@@ -158,12 +156,16 @@ public final class WebHttpHandlerBuilder {
|
||||
WebHttpHandlerBuilder builder = new WebHttpHandlerBuilder(
|
||||
context.getBean(WEB_HANDLER_BEAN_NAME, WebHandler.class), context);
|
||||
|
||||
// Autowire lists for @Bean + @Order
|
||||
|
||||
SortedBeanContainer container = new SortedBeanContainer();
|
||||
context.getAutowireCapableBeanFactory().autowireBean(container);
|
||||
builder.filters(filters -> filters.addAll(container.getFilters()));
|
||||
builder.exceptionHandlers(handlers -> handlers.addAll(container.getExceptionHandlers()));
|
||||
List<WebFilter> webFilters = context
|
||||
.getBeanProvider(WebFilter.class)
|
||||
.orderedStream()
|
||||
.collect(Collectors.toList());
|
||||
builder.filters(filters -> filters.addAll(webFilters));
|
||||
List<WebExceptionHandler> exceptionHandlers = context
|
||||
.getBeanProvider(WebExceptionHandler.class)
|
||||
.orderedStream()
|
||||
.collect(Collectors.toList());
|
||||
builder.exceptionHandlers(handlers -> handlers.addAll(exceptionHandlers));
|
||||
|
||||
try {
|
||||
builder.sessionManager(
|
||||
@@ -389,30 +391,4 @@ public final class WebHttpHandlerBuilder {
|
||||
return new WebHttpHandlerBuilder(this);
|
||||
}
|
||||
|
||||
|
||||
private static class SortedBeanContainer {
|
||||
|
||||
private List<WebFilter> filters = Collections.emptyList();
|
||||
|
||||
private List<WebExceptionHandler> exceptionHandlers = Collections.emptyList();
|
||||
|
||||
@Autowired(required = false)
|
||||
public void setFilters(List<WebFilter> filters) {
|
||||
this.filters = filters;
|
||||
}
|
||||
|
||||
public List<WebFilter> getFilters() {
|
||||
return this.filters;
|
||||
}
|
||||
|
||||
@Autowired(required = false)
|
||||
public void setExceptionHandlers(List<WebExceptionHandler> exceptionHandlers) {
|
||||
this.exceptionHandlers = exceptionHandlers;
|
||||
}
|
||||
|
||||
public List<WebExceptionHandler> getExceptionHandlers() {
|
||||
return this.exceptionHandlers;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user