|
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