From 426ff3ada742d5f79d7ffd23bc187ea937a15147 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 20 Sep 2018 16:16:42 +0100 Subject: [PATCH] Store ObjectProvider rather than their Streams to allow reuse Generally speaking, methods on configuration classes will only be called once and, therefore, it should be safe to hold a reference to a Stream for later one-time usage. However, there are some scenarios in Spring Fu where functional registration results in an attempt being made to use a Stream more than use. This commit protects against multiple use by storing the ObjectProvider and getting a new ordered Stream each time it's needed. Closes gh-14467 --- ...eyManagementChildContextConfiguration.java | 8 +++----- .../cache/JCacheCacheConfiguration.java | 13 ++++++------- .../cassandra/CassandraAutoConfiguration.java | 8 ++++---- .../redis/JedisConnectionConfiguration.java | 8 ++++---- .../redis/LettuceConnectionConfiguration.java | 8 ++++---- .../jest/JestAutoConfiguration.java | 8 ++++---- .../rest/RestClientAutoConfiguration.java | 9 ++++----- .../jersey/JerseyAutoConfiguration.java | 8 ++++---- .../ArtemisEmbeddedServerConfiguration.java | 7 +++---- .../quartz/QuartzAutoConfiguration.java | 7 +++---- .../thymeleaf/ThymeleafAutoConfiguration.java | 13 ++++++------- .../reactive/WebFluxAutoConfiguration.java | 19 +++++++++---------- 12 files changed, 54 insertions(+), 62 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementChildContextConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementChildContextConfiguration.java index c9375606bf0..1497d8dee85 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementChildContextConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/jersey/JerseyManagementChildContextConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.boot.actuate.autoconfigure.web.jersey; -import java.util.stream.Stream; - import org.glassfish.jersey.server.ResourceConfig; import org.glassfish.jersey.servlet.ServletContainer; @@ -47,11 +45,11 @@ import org.springframework.context.annotation.Bean; @ConditionalOnMissingClass("org.springframework.web.servlet.DispatcherServlet") public class JerseyManagementChildContextConfiguration { - private final Stream resourceConfigCustomizers; + private final ObjectProvider resourceConfigCustomizers; public JerseyManagementChildContextConfiguration( ObjectProvider resourceConfigCustomizers) { - this.resourceConfigCustomizers = resourceConfigCustomizers.orderedStream(); + this.resourceConfigCustomizers = resourceConfigCustomizers; } @Bean @@ -63,7 +61,7 @@ public class JerseyManagementChildContextConfiguration { @Bean public ResourceConfig endpointResourceConfig() { ResourceConfig resourceConfig = new ResourceConfig(); - this.resourceConfigCustomizers + this.resourceConfigCustomizers.orderedStream() .forEach((customizer) -> customizer.customize(resourceConfig)); return resourceConfig; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java index 76039134583..737ac55fac9 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cache/JCacheCacheConfiguration.java @@ -20,7 +20,6 @@ import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Properties; -import java.util.stream.Stream; import javax.cache.CacheManager; import javax.cache.Caching; @@ -70,9 +69,9 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware { private final javax.cache.configuration.Configuration defaultCacheConfiguration; - private final Stream cacheManagerCustomizers; + private final ObjectProvider cacheManagerCustomizers; - private final Stream cachePropertiesCustomizers; + private final ObjectProvider cachePropertiesCustomizers; private ClassLoader beanClassLoader; @@ -84,8 +83,8 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware { this.cacheProperties = cacheProperties; this.customizers = customizers; this.defaultCacheConfiguration = defaultCacheConfiguration.getIfAvailable(); - this.cacheManagerCustomizers = cacheManagerCustomizers.orderedStream(); - this.cachePropertiesCustomizers = cachePropertiesCustomizers.orderedStream(); + this.cacheManagerCustomizers = cacheManagerCustomizers; + this.cachePropertiesCustomizers = cachePropertiesCustomizers; } @Override @@ -135,7 +134,7 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware { private Properties createCacheManagerProperties() { Properties properties = new Properties(); - this.cachePropertiesCustomizers.forEach( + this.cachePropertiesCustomizers.orderedStream().forEach( (customizer) -> customizer.customize(this.cacheProperties, properties)); return properties; } @@ -148,7 +147,7 @@ class JCacheCacheConfiguration implements BeanClassLoaderAware { } private void customize(CacheManager cacheManager) { - this.cacheManagerCustomizers + this.cacheManagerCustomizers.orderedStream() .forEach((customizer) -> customizer.customize(cacheManager)); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java index 1fc46a84490..551b9cddfd0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.cassandra; import java.time.Duration; -import java.util.stream.Stream; import com.datastax.driver.core.Cluster; import com.datastax.driver.core.PoolingOptions; @@ -51,12 +50,12 @@ public class CassandraAutoConfiguration { private final CassandraProperties properties; - private final Stream builderCustomizers; + private final ObjectProvider builderCustomizers; public CassandraAutoConfiguration(CassandraProperties properties, ObjectProvider builderCustomizers) { this.properties = properties; - this.builderCustomizers = builderCustomizers.orderedStream(); + this.builderCustomizers = builderCustomizers; } @Bean @@ -88,7 +87,8 @@ public class CassandraAutoConfiguration { } private void customize(Cluster.Builder builder) { - this.builderCustomizers.forEach((customizer) -> customizer.customize(builder)); + this.builderCustomizers.orderedStream() + .forEach((customizer) -> customizer.customize(builder)); } private QueryOptions getQueryOptions() { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java index 21a19b136b2..b98d33e7f40 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/JedisConnectionConfiguration.java @@ -18,7 +18,6 @@ package org.springframework.boot.autoconfigure.data.redis; import java.net.UnknownHostException; import java.time.Duration; -import java.util.stream.Stream; import org.apache.commons.pool2.impl.GenericObjectPool; import redis.clients.jedis.Jedis; @@ -50,7 +49,7 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration { private final RedisProperties properties; - private final Stream builderCustomizers; + private final ObjectProvider builderCustomizers; JedisConnectionConfiguration(RedisProperties properties, ObjectProvider sentinelConfiguration, @@ -58,7 +57,7 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration { ObjectProvider builderCustomizers) { super(properties, sentinelConfiguration, clusterConfiguration); this.properties = properties; - this.builderCustomizers = builderCustomizers.orderedStream(); + this.builderCustomizers = builderCustomizers; } @Bean @@ -131,7 +130,8 @@ class JedisConnectionConfiguration extends RedisConnectionConfiguration { private void customize( JedisClientConfiguration.JedisClientConfigurationBuilder builder) { - this.builderCustomizers.forEach((customizer) -> customizer.customize(builder)); + this.builderCustomizers.orderedStream() + .forEach((customizer) -> customizer.customize(builder)); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java index 2bd846d5812..bbf03afe847 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/redis/LettuceConnectionConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.data.redis; import java.net.UnknownHostException; -import java.util.stream.Stream; import io.lettuce.core.RedisClient; import io.lettuce.core.resource.ClientResources; @@ -51,7 +50,7 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { private final RedisProperties properties; - private final Stream builderCustomizers; + private final ObjectProvider builderCustomizers; LettuceConnectionConfiguration(RedisProperties properties, ObjectProvider sentinelConfigurationProvider, @@ -59,7 +58,7 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { ObjectProvider builderCustomizers) { super(properties, sentinelConfigurationProvider, clusterConfigurationProvider); this.properties = properties; - this.builderCustomizers = builderCustomizers.orderedStream(); + this.builderCustomizers = builderCustomizers; } @Bean(destroyMethod = "shutdown") @@ -137,7 +136,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration { private void customize( LettuceClientConfiguration.LettuceClientConfigurationBuilder builder) { - this.builderCustomizers.forEach((customizer) -> customizer.customize(builder)); + this.builderCustomizers.orderedStream() + .forEach((customizer) -> customizer.customize(builder)); } /** diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfiguration.java index 109f6d85584..eb9a78bc946 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/jest/JestAutoConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.boot.autoconfigure.elasticsearch.jest; import java.time.Duration; -import java.util.stream.Stream; import com.google.gson.Gson; import io.searchbox.client.JestClient; @@ -54,13 +53,13 @@ public class JestAutoConfiguration { private final ObjectProvider gsonProvider; - private final Stream builderCustomizers; + private final ObjectProvider builderCustomizers; public JestAutoConfiguration(JestProperties properties, ObjectProvider gson, ObjectProvider builderCustomizers) { this.properties = properties; this.gsonProvider = gson; - this.builderCustomizers = builderCustomizers.orderedStream(); + this.builderCustomizers = builderCustomizers; } @Bean(destroyMethod = "shutdownClient") @@ -93,7 +92,8 @@ public class JestAutoConfiguration { } private void customize(HttpClientConfig.Builder builder) { - this.builderCustomizers.forEach((customizer) -> customizer.customize(builder)); + this.builderCustomizers.orderedStream() + .forEach((customizer) -> customizer.customize(builder)); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java index a46a58c75c2..817f5902839 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.boot.autoconfigure.elasticsearch.rest; -import java.util.stream.Stream; - import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; @@ -50,12 +48,12 @@ public class RestClientAutoConfiguration { private final RestClientProperties properties; - private final Stream builderCustomizers; + private final ObjectProvider builderCustomizers; public RestClientAutoConfiguration(RestClientProperties properties, ObjectProvider builderCustomizers) { this.properties = properties; - this.builderCustomizers = builderCustomizers.orderedStream(); + this.builderCustomizers = builderCustomizers; } @Bean @@ -79,7 +77,8 @@ public class RestClientAutoConfiguration { builder.setHttpClientConfigCallback((httpClientBuilder) -> httpClientBuilder .setDefaultCredentialsProvider(credentialsProvider)); }); - this.builderCustomizers.forEach((customizer) -> customizer.customize(builder)); + this.builderCustomizers.orderedStream() + .forEach((customizer) -> customizer.customize(builder)); return builder; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java index 2d5b2923abf..f6bf034c377 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jersey/JerseyAutoConfiguration.java @@ -18,7 +18,6 @@ package org.springframework.boot.autoconfigure.jersey; import java.util.Arrays; import java.util.EnumSet; -import java.util.stream.Stream; import javax.annotation.PostConstruct; import javax.servlet.DispatcherType; @@ -93,7 +92,7 @@ public class JerseyAutoConfiguration implements ServletContextAware { private final ResourceConfig config; - private final Stream customizers; + private final ObjectProvider customizers; private String path; @@ -101,7 +100,7 @@ public class JerseyAutoConfiguration implements ServletContextAware { ObjectProvider customizers) { this.jersey = jersey; this.config = config; - this.customizers = customizers.orderedStream(); + this.customizers = customizers; } @PostConstruct @@ -121,7 +120,8 @@ public class JerseyAutoConfiguration implements ServletContextAware { } private void customize() { - this.customizers.forEach((customizer) -> customizer.customize(this.config)); + this.customizers.orderedStream() + .forEach((customizer) -> customizer.customize(this.config)); } @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java index d6847cafa30..0faa74fe6fc 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisEmbeddedServerConfiguration.java @@ -19,7 +19,6 @@ package org.springframework.boot.autoconfigure.jms.artemis; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; -import java.util.stream.Stream; import org.apache.activemq.artemis.jms.server.config.JMSConfiguration; import org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration; @@ -50,7 +49,7 @@ class ArtemisEmbeddedServerConfiguration { private final ArtemisProperties properties; - private final Stream configurationCustomizers; + private final ObjectProvider configurationCustomizers; private final List queuesConfiguration; @@ -61,7 +60,7 @@ class ArtemisEmbeddedServerConfiguration { ObjectProvider queuesConfiguration, ObjectProvider topicsConfiguration) { this.properties = properties; - this.configurationCustomizers = configurationCustomizers.orderedStream(); + this.configurationCustomizers = configurationCustomizers; this.queuesConfiguration = queuesConfiguration.orderedStream() .collect(Collectors.toList()); this.topicsConfiguration = topicsConfiguration.orderedStream() @@ -90,7 +89,7 @@ class ArtemisEmbeddedServerConfiguration { private void customize( org.apache.activemq.artemis.core.config.Configuration configuration) { - this.configurationCustomizers + this.configurationCustomizers.orderedStream() .forEach((customizer) -> customizer.customize(configuration)); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java index 0f9ff19bc47..7e8f09bb00a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java @@ -18,7 +18,6 @@ package org.springframework.boot.autoconfigure.quartz; import java.util.Map; import java.util.Properties; -import java.util.stream.Stream; import javax.sql.DataSource; @@ -61,7 +60,7 @@ public class QuartzAutoConfiguration { private final QuartzProperties properties; - private final Stream customizers; + private final ObjectProvider customizers; private final JobDetail[] jobDetails; @@ -77,7 +76,7 @@ public class QuartzAutoConfiguration { ObjectProvider> calendars, ObjectProvider triggers, ApplicationContext applicationContext) { this.properties = properties; - this.customizers = customizers.orderedStream(); + this.customizers = customizers; this.jobDetails = jobDetails.getIfAvailable(); this.calendars = calendars.getIfAvailable(); this.triggers = triggers.getIfAvailable(); @@ -124,7 +123,7 @@ public class QuartzAutoConfiguration { } private void customize(SchedulerFactoryBean schedulerFactoryBean) { - this.customizers + this.customizers.orderedStream() .forEach((customizer) -> customizer.customize(schedulerFactoryBean)); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java index 97e308db1d9..1490a2a94d4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java @@ -18,7 +18,6 @@ package org.springframework.boot.autoconfigure.thymeleaf; import java.util.Collection; import java.util.LinkedHashMap; -import java.util.stream.Stream; import javax.annotation.PostConstruct; @@ -136,14 +135,14 @@ public class ThymeleafAutoConfiguration { private final Collection templateResolvers; - private final Stream dialects; + private final ObjectProvider dialects; public ThymeleafDefaultConfiguration(ThymeleafProperties properties, Collection templateResolvers, ObjectProvider dialectsProvider) { this.properties = properties; this.templateResolvers = templateResolvers; - this.dialects = dialectsProvider.orderedStream(); + this.dialects = dialectsProvider; } @Bean @@ -152,7 +151,7 @@ public class ThymeleafAutoConfiguration { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setEnableSpringELCompiler(this.properties.isEnableSpringElCompiler()); this.templateResolvers.forEach(engine::addTemplateResolver); - this.dialects.forEach(engine::addDialect); + this.dialects.orderedStream().forEach(engine::addDialect); return engine; } @@ -224,14 +223,14 @@ public class ThymeleafAutoConfiguration { private final Collection templateResolvers; - private final Stream dialects; + private final ObjectProvider dialects; ThymeleafReactiveConfiguration(ThymeleafProperties properties, Collection templateResolvers, ObjectProvider dialectsProvider) { this.properties = properties; this.templateResolvers = templateResolvers; - this.dialects = dialectsProvider.orderedStream(); + this.dialects = dialectsProvider; } @Bean @@ -240,7 +239,7 @@ public class ThymeleafAutoConfiguration { SpringWebFluxTemplateEngine engine = new SpringWebFluxTemplateEngine(); engine.setEnableSpringELCompiler(this.properties.isEnableSpringElCompiler()); this.templateResolvers.forEach(engine::addTemplateResolver); - this.dialects.forEach(engine::addDialect); + this.dialects.orderedStream().forEach(engine::addDialect); return engine; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java index a58463aebe0..69c67aabb05 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/WebFluxAutoConfiguration.java @@ -19,7 +19,6 @@ package org.springframework.boot.autoconfigure.web.reactive; import java.time.Duration; import java.util.Collection; import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -114,13 +113,13 @@ public class WebFluxAutoConfiguration { private final ListableBeanFactory beanFactory; - private final Stream argumentResolvers; + private final ObjectProvider argumentResolvers; - private final Stream codecCustomizers; + private final ObjectProvider codecCustomizers; private final ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; - private final Stream viewResolvers; + private final ObjectProvider viewResolvers; public WebFluxConfig(ResourceProperties resourceProperties, WebFluxProperties webFluxProperties, ListableBeanFactory beanFactory, @@ -131,21 +130,21 @@ public class WebFluxAutoConfiguration { this.resourceProperties = resourceProperties; this.webFluxProperties = webFluxProperties; this.beanFactory = beanFactory; - this.argumentResolvers = resolvers.orderedStream(); - this.codecCustomizers = codecCustomizers.orderedStream(); + this.argumentResolvers = resolvers; + this.codecCustomizers = codecCustomizers; this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizer .getIfAvailable(); - this.viewResolvers = viewResolvers.orderedStream(); + this.viewResolvers = viewResolvers; } @Override public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) { - this.argumentResolvers.forEach(configurer::addCustomResolver); + this.argumentResolvers.orderedStream().forEach(configurer::addCustomResolver); } @Override public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) { - this.codecCustomizers + this.codecCustomizers.orderedStream() .forEach((customizer) -> customizer.customize(configurer)); } @@ -181,7 +180,7 @@ public class WebFluxAutoConfiguration { @Override public void configureViewResolvers(ViewResolverRegistry registry) { - this.viewResolvers.forEach(registry::viewResolver); + this.viewResolvers.orderedStream().forEach(registry::viewResolver); } @Override