6868import org .springframework .boot .webflux .autoconfigure .HttpHandlerAutoConfiguration ;
6969import org .springframework .boot .webflux .autoconfigure .WebFluxAutoConfiguration ;
7070import org .springframework .boot .webflux .autoconfigure .WebFluxProperties ;
71+ import org .springframework .boot .webflux .autoconfigure .WebFluxProperties .Apiversion ;
7172import org .springframework .cloud .gateway .actuate .GatewayControllerEndpoint ;
7273import org .springframework .cloud .gateway .actuate .GatewayLegacyControllerEndpoint ;
7374import org .springframework .cloud .gateway .config .conditional .ConditionalOnEnabledFilter ;
188189import org .springframework .security .oauth2 .client .ReactiveOAuth2AuthorizedClientManager ;
189190import org .springframework .security .web .server .SecurityWebFilterChain ;
190191import org .springframework .util .ClassUtils ;
192+ import org .springframework .util .CollectionUtils ;
191193import org .springframework .util .StringUtils ;
192194import org .springframework .validation .Validator ;
193195import org .springframework .web .accept .ApiVersionParser ;
198200import org .springframework .web .reactive .accept .ApiVersionStrategy ;
199201import org .springframework .web .reactive .accept .MediaTypeParamApiVersionResolver ;
200202import org .springframework .web .reactive .accept .PathApiVersionResolver ;
201- import org .springframework .web .reactive .config .ApiVersionConfigurer ;
202- import org .springframework .web .reactive .config .WebFluxConfigurer ;
203203import org .springframework .web .reactive .socket .client .ReactorNettyWebSocketClient ;
204204import org .springframework .web .reactive .socket .client .WebSocketClient ;
205205import org .springframework .web .reactive .socket .server .RequestUpgradeStrategy ;
206206import org .springframework .web .reactive .socket .server .WebSocketService ;
207207import org .springframework .web .reactive .socket .server .support .HandshakeWebSocketService ;
208208import org .springframework .web .reactive .socket .server .upgrade .ReactorNettyRequestUpgradeStrategy ;
209- import org .springframework .web .server .ServerWebExchange ;
210209
211210/**
212211 * @author Spencer Gibb
@@ -524,7 +523,7 @@ public RemoteAddrRoutePredicateFactory remoteAddrRoutePredicateFactory() {
524523 @ Bean
525524 @ ConditionalOnEnabledPredicate
526525 public VersionRoutePredicateFactory versionRoutePredicateFactory (
527- @ Qualifier ("mvcApiVersionStrategy " ) @ Nullable ApiVersionStrategy apiVersionStrategy ) {
526+ @ Qualifier ("webFluxApiVersionStrategy " ) @ Nullable ApiVersionStrategy apiVersionStrategy ) {
528527 return new VersionRoutePredicateFactory (apiVersionStrategy );
529528 }
530529
@@ -776,13 +775,13 @@ public GzipMessageBodyResolver gzipMessageBodyResolver() {
776775 }
777776
778777 @ Bean
779- public GatewayServerWebfluxBeanPostProcessor gatewayServerWebfluxBeanPostProcessor (
780- VersionProperties versionProperties ,
778+ public GatewayServerWebfluxBeanPostProcessor gatewayServerWebfluxBeanPostProcessor (WebFluxProperties properties ,
781779 ObjectProvider <ApiVersionDeprecationHandler > deprecationHandlerProvider ,
782780 ObjectProvider <ApiVersionParser <?>> versionParserProvider ,
783781 ObjectProvider <ApiVersionResolver > versionResolvers ) {
784- return new GatewayServerWebfluxBeanPostProcessor (versionProperties , deprecationHandlerProvider .getIfAvailable (),
785- versionParserProvider .getIfAvailable (), versionResolvers .orderedStream ().toList ());
782+ return new GatewayServerWebfluxBeanPostProcessor (properties .getApiversion (),
783+ deprecationHandlerProvider .getIfAvailable (), versionParserProvider .getIfAvailable (),
784+ versionResolvers .orderedStream ().toList ());
786785 }
787786
788787 @ Bean
@@ -963,47 +962,17 @@ public TokenRelayGatewayFilterFactory tokenRelayGatewayFilterFactory(
963962
964963 }
965964
966- // FIXME: without adding a version resolver, things fail until I can replace
967- // ApiVersionStrategy in a bean post processor
968- @ Configuration (proxyBeanMethods = false )
969- protected static class ApiVersionConfiguration implements WebFluxConfigurer {
970-
971- private final VersionProperties versionProperties ;
972-
973- protected ApiVersionConfiguration (VersionProperties versionProperties ) {
974- this .versionProperties = versionProperties ;
975- }
976-
977- @ Override
978- public void configureApiVersioning (ApiVersionConfigurer configurer ) {
979- if (StringUtils .hasText (versionProperties .getHeaderName ())
980- || (versionProperties .getMediaType () != null
981- && StringUtils .hasText (versionProperties .getMediaTypeParamName ()))
982- || versionProperties .getPathSegment () != null
983- || StringUtils .hasText (versionProperties .getRequestParamName ())) {
984- // only add if version resolver configured
985- configurer .useVersionResolver (new ApiVersionResolver () {
986- @ Override
987- public @ Nullable String resolveVersion (ServerWebExchange exchange ) {
988- return null ;
989- }
990- });
991- }
992- }
993-
994- }
995-
996965 protected static class GatewayServerWebfluxBeanPostProcessor implements BeanPostProcessor {
997966
998- private final VersionProperties versionProperties ;
967+ private final Apiversion versionProperties ;
999968
1000969 private final ApiVersionDeprecationHandler deprecationHandler ;
1001970
1002971 private final ApiVersionParser <?> versionParser ;
1003972
1004973 private final List <ApiVersionResolver > apiVersionResolvers ;
1005974
1006- public GatewayServerWebfluxBeanPostProcessor (VersionProperties versionProperties ,
975+ public GatewayServerWebfluxBeanPostProcessor (Apiversion versionProperties ,
1007976 ApiVersionDeprecationHandler deprecationHandler , ApiVersionParser <?> versionParser ,
1008977 List <ApiVersionResolver > apiVersionResolvers ) {
1009978 this .versionProperties = versionProperties ;
@@ -1016,24 +985,25 @@ public GatewayServerWebfluxBeanPostProcessor(VersionProperties versionProperties
1016985 public @ Nullable Object postProcessAfterInitialization (Object bean , String beanName ) throws BeansException {
1017986
1018987 // TODO: Use custom ApiVersionConfigurer when able to
1019- if (bean instanceof ApiVersionStrategy && beanName .equals ("mvcApiVersionStrategy " )) {
988+ if (bean instanceof ApiVersionStrategy && beanName .equals ("webFluxApiVersionStrategy " )) {
1020989 List <ApiVersionResolver > versionResolvers = new ArrayList <>();
1021- if (StringUtils .hasText (versionProperties .getHeaderName ())) {
1022- versionResolvers .add (
1023- exchange -> exchange .getRequest ().getHeaders ().getFirst (versionProperties .getHeaderName ()));
990+ if (StringUtils .hasText (versionProperties .getUse ().getHeader ())) {
991+ versionResolvers .add (exchange -> exchange .getRequest ()
992+ .getHeaders ()
993+ .getFirst (versionProperties .getUse ().getHeader ()));
1024994 }
1025- if (versionProperties .getMediaType () != null
1026- && StringUtils . hasText ( versionProperties . getMediaTypeParamName ())) {
1027- versionResolvers .add (new MediaTypeParamApiVersionResolver (versionProperties . getMediaType (),
1028- versionProperties . getMediaTypeParamName ()) );
995+ if (! CollectionUtils . isEmpty ( versionProperties .getUse (). getMediaTypeParameter ())) {
996+ versionProperties . getUse (). getMediaTypeParameter (). forEach (( mediaType , param ) -> {
997+ versionResolvers .add (new MediaTypeParamApiVersionResolver (mediaType , param ));
998+ } );
1029999 }
1030- if (versionProperties .getPathSegment () != null ) {
1031- versionResolvers .add (new PathApiVersionResolver (versionProperties .getPathSegment ()));
1000+ if (versionProperties .getUse (). getPathSegment () != null ) {
1001+ versionResolvers .add (new PathApiVersionResolver (versionProperties .getUse (). getPathSegment ()));
10321002 }
1033- if (StringUtils .hasText (versionProperties .getRequestParamName ())) {
1003+ if (StringUtils .hasText (versionProperties .getUse (). getQueryParameter ())) {
10341004 versionResolvers .add (exchange -> exchange .getRequest ()
10351005 .getQueryParams ()
1036- .getFirst (versionProperties .getRequestParamName ()));
1006+ .getFirst (versionProperties .getUse (). getQueryParameter ()));
10371007 }
10381008
10391009 if (apiVersionResolvers != null && !apiVersionResolvers .isEmpty ()) {
@@ -1044,11 +1014,18 @@ public GatewayServerWebfluxBeanPostProcessor(VersionProperties versionProperties
10441014 return bean ;
10451015 }
10461016
1017+ Boolean required = versionProperties .getRequired ();
1018+ if (required == null ) {
1019+ required = false ;
1020+ }
1021+ Boolean detectSupported = versionProperties .getDetectSupported ();
1022+ if (detectSupported == null ) {
1023+ detectSupported = true ;
1024+ }
10471025 GatewayApiVersionStrategy strategy = new GatewayApiVersionStrategy (versionResolvers , versionParser ,
1048- versionProperties .isRequired (), versionProperties .getDefaultVersion (),
1049- versionProperties .isDetectSupportedVersions (), deprecationHandler );
1050- if (!versionProperties .getSupportedVersions ().isEmpty ()) {
1051- strategy .addSupportedVersion (versionProperties .getSupportedVersions ().toArray (new String [0 ]));
1026+ required , versionProperties .getDefaultVersion (), detectSupported , deprecationHandler );
1027+ if (!CollectionUtils .isEmpty (versionProperties .getSupported ())) {
1028+ strategy .addSupportedVersion (versionProperties .getSupported ().toArray (new String [0 ]));
10521029 }
10531030 return strategy ;
10541031 }
0 commit comments