|
22 | 22 | import java.security.KeyStoreException;
|
23 | 23 | import java.security.NoSuchAlgorithmException;
|
24 | 24 | import java.security.cert.CertificateException;
|
25 |
| -import java.util.ArrayList; |
26 | 25 | import java.util.List;
|
27 | 26 | import java.util.Set;
|
28 | 27 | import java.util.function.Supplier;
|
|
42 | 41 | import org.springframework.aot.hint.RuntimeHints;
|
43 | 42 | import org.springframework.aot.hint.RuntimeHintsRegistrar;
|
44 | 43 | import org.springframework.aot.hint.TypeReference;
|
45 |
| -import org.springframework.beans.BeansException; |
46 | 44 | import org.springframework.beans.factory.BeanFactory;
|
47 | 45 | import org.springframework.beans.factory.ObjectProvider;
|
48 | 46 | import org.springframework.beans.factory.annotation.Qualifier;
|
49 |
| -import org.springframework.beans.factory.config.BeanPostProcessor; |
50 | 47 | import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
|
51 | 48 | import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
|
52 | 49 | import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
|
191 | 188 | import org.springframework.util.CollectionUtils;
|
192 | 189 | import org.springframework.util.StringUtils;
|
193 | 190 | import org.springframework.validation.Validator;
|
194 |
| -import org.springframework.web.accept.ApiVersionParser; |
195 |
| -import org.springframework.web.accept.SemanticApiVersionParser; |
196 | 191 | import org.springframework.web.reactive.DispatcherHandler;
|
197 |
| -import org.springframework.web.reactive.accept.ApiVersionDeprecationHandler; |
198 |
| -import org.springframework.web.reactive.accept.ApiVersionResolver; |
199 | 192 | import org.springframework.web.reactive.accept.ApiVersionStrategy;
|
200 |
| -import org.springframework.web.reactive.accept.DefaultApiVersionStrategy; |
201 |
| -import org.springframework.web.reactive.accept.MediaTypeParamApiVersionResolver; |
202 |
| -import org.springframework.web.reactive.accept.PathApiVersionResolver; |
| 193 | +import org.springframework.web.reactive.config.ApiVersionConfigurer; |
| 194 | +import org.springframework.web.reactive.config.WebFluxConfigurer; |
203 | 195 | import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient;
|
204 | 196 | import org.springframework.web.reactive.socket.client.WebSocketClient;
|
205 | 197 | import org.springframework.web.reactive.socket.server.RequestUpgradeStrategy;
|
@@ -774,23 +766,41 @@ public GzipMessageBodyResolver gzipMessageBodyResolver() {
|
774 | 766 | return new GzipMessageBodyResolver();
|
775 | 767 | }
|
776 | 768 |
|
777 |
| - @Bean |
778 |
| - public GatewayServerWebfluxBeanPostProcessor gatewayServerWebfluxBeanPostProcessor( |
779 |
| - ObjectProvider<WebFluxProperties> properties, |
780 |
| - ObjectProvider<ApiVersionDeprecationHandler> deprecationHandlerProvider, |
781 |
| - ObjectProvider<ApiVersionParser<?>> versionParserProvider, |
782 |
| - ObjectProvider<ApiVersionResolver> versionResolvers) { |
783 |
| - return new GatewayServerWebfluxBeanPostProcessor( |
784 |
| - properties.getIfAvailable(WebFluxProperties::new).getApiversion(), |
785 |
| - deprecationHandlerProvider.getIfAvailable(), versionParserProvider.getIfAvailable(), |
786 |
| - versionResolvers.orderedStream().toList()); |
787 |
| - } |
788 |
| - |
789 | 769 | @Bean
|
790 | 770 | static ConfigurableHintsRegistrationProcessor configurableHintsRegistrationProcessor() {
|
791 | 771 | return new ConfigurableHintsRegistrationProcessor();
|
792 | 772 | }
|
793 | 773 |
|
| 774 | + @Configuration(proxyBeanMethods = false) |
| 775 | + static class GatewayWebFluxApiVersionConfig implements WebFluxConfigurer { |
| 776 | + |
| 777 | + final Apiversion versionProperties; |
| 778 | + |
| 779 | + GatewayWebFluxApiVersionConfig(ObjectProvider<WebFluxProperties> webFluxProperties) { |
| 780 | + this.versionProperties = webFluxProperties.getIfAvailable(WebFluxProperties::new).getApiversion(); |
| 781 | + } |
| 782 | + |
| 783 | + @Override |
| 784 | + public void configureApiVersioning(ApiVersionConfigurer configurer) { |
| 785 | + Boolean required = versionProperties.getRequired(); |
| 786 | + Boolean detectSupported = versionProperties.getDetectSupported(); |
| 787 | + |
| 788 | + Apiversion.Use use = versionProperties.getUse(); |
| 789 | + // only set defaults is one or more use options is set |
| 790 | + if (StringUtils.hasText(use.getHeader()) || StringUtils.hasText(use.getQueryParameter()) |
| 791 | + || use.getPathSegment() != null || !CollectionUtils.isEmpty(use.getMediaTypeParameter())) { |
| 792 | + if (required == null) { |
| 793 | + configurer.setVersionRequired(false); |
| 794 | + } |
| 795 | + if (detectSupported == null) { |
| 796 | + configurer.detectSupportedVersions(true); |
| 797 | + } |
| 798 | + configurer.setSupportedVersionPredicate(comparable -> true); |
| 799 | + } |
| 800 | + } |
| 801 | + |
| 802 | + } |
| 803 | + |
794 | 804 | @Configuration(proxyBeanMethods = false)
|
795 | 805 | @ConditionalOnClass(AsyncProxyManager.class)
|
796 | 806 | protected static class Bucket4jConfiguration {
|
@@ -964,79 +974,6 @@ public TokenRelayGatewayFilterFactory tokenRelayGatewayFilterFactory(
|
964 | 974 |
|
965 | 975 | }
|
966 | 976 |
|
967 |
| - protected static class GatewayServerWebfluxBeanPostProcessor implements BeanPostProcessor { |
968 |
| - |
969 |
| - private final Apiversion versionProperties; |
970 |
| - |
971 |
| - private final ApiVersionDeprecationHandler deprecationHandler; |
972 |
| - |
973 |
| - private final ApiVersionParser<?> versionParser; |
974 |
| - |
975 |
| - private final List<ApiVersionResolver> apiVersionResolvers; |
976 |
| - |
977 |
| - public GatewayServerWebfluxBeanPostProcessor(Apiversion versionProperties, |
978 |
| - ApiVersionDeprecationHandler deprecationHandler, ApiVersionParser<?> versionParser, |
979 |
| - List<ApiVersionResolver> apiVersionResolvers) { |
980 |
| - this.versionProperties = versionProperties; |
981 |
| - this.deprecationHandler = deprecationHandler; |
982 |
| - this.versionParser = (versionParser != null) ? versionParser : new SemanticApiVersionParser(); |
983 |
| - this.apiVersionResolvers = apiVersionResolvers; |
984 |
| - } |
985 |
| - |
986 |
| - @Override |
987 |
| - public @Nullable Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { |
988 |
| - |
989 |
| - // TODO: Use custom ApiVersionConfigurer when able to |
990 |
| - if (bean instanceof ApiVersionStrategy && beanName.equals("webFluxApiVersionStrategy")) { |
991 |
| - List<ApiVersionResolver> versionResolvers = new ArrayList<>(); |
992 |
| - if (StringUtils.hasText(versionProperties.getUse().getHeader())) { |
993 |
| - versionResolvers.add(exchange -> exchange.getRequest() |
994 |
| - .getHeaders() |
995 |
| - .getFirst(versionProperties.getUse().getHeader())); |
996 |
| - } |
997 |
| - if (!CollectionUtils.isEmpty(versionProperties.getUse().getMediaTypeParameter())) { |
998 |
| - versionProperties.getUse().getMediaTypeParameter().forEach((mediaType, param) -> { |
999 |
| - versionResolvers.add(new MediaTypeParamApiVersionResolver(mediaType, param)); |
1000 |
| - }); |
1001 |
| - } |
1002 |
| - if (versionProperties.getUse().getPathSegment() != null) { |
1003 |
| - versionResolvers.add(new PathApiVersionResolver(versionProperties.getUse().getPathSegment())); |
1004 |
| - } |
1005 |
| - if (StringUtils.hasText(versionProperties.getUse().getQueryParameter())) { |
1006 |
| - versionResolvers.add(exchange -> exchange.getRequest() |
1007 |
| - .getQueryParams() |
1008 |
| - .getFirst(versionProperties.getUse().getQueryParameter())); |
1009 |
| - } |
1010 |
| - |
1011 |
| - if (apiVersionResolvers != null && !apiVersionResolvers.isEmpty()) { |
1012 |
| - versionResolvers.addAll(apiVersionResolvers); |
1013 |
| - } |
1014 |
| - |
1015 |
| - if (versionResolvers.isEmpty()) { |
1016 |
| - return bean; |
1017 |
| - } |
1018 |
| - |
1019 |
| - Boolean required = versionProperties.getRequired(); |
1020 |
| - if (required == null) { |
1021 |
| - required = false; |
1022 |
| - } |
1023 |
| - Boolean detectSupported = versionProperties.getDetectSupported(); |
1024 |
| - if (detectSupported == null) { |
1025 |
| - detectSupported = true; |
1026 |
| - } |
1027 |
| - DefaultApiVersionStrategy strategy = new DefaultApiVersionStrategy(versionResolvers, versionParser, |
1028 |
| - required, versionProperties.getDefaultVersion(), detectSupported, comparable -> true, |
1029 |
| - deprecationHandler); |
1030 |
| - if (!CollectionUtils.isEmpty(versionProperties.getSupported())) { |
1031 |
| - strategy.addSupportedVersion(versionProperties.getSupported().toArray(new String[0])); |
1032 |
| - } |
1033 |
| - return strategy; |
1034 |
| - } |
1035 |
| - return bean; |
1036 |
| - } |
1037 |
| - |
1038 |
| - } |
1039 |
| - |
1040 | 977 | }
|
1041 | 978 |
|
1042 | 979 | class GatewayHints implements RuntimeHintsRegistrar {
|
|
0 commit comments