Skip to content

Commit 53ca7f4

Browse files
committed
Ordering of GlobalOpenApiCustomizers different than for OpenApiCustomisers. Fixes #2107
1 parent e88429b commit 53ca7f4

File tree

17 files changed

+432
-69
lines changed

17 files changed

+432
-69
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import org.springdoc.core.customizers.RouterOperationCustomizer;
6464
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
6565
import org.springdoc.core.customizers.SpringDocCustomizers;
66+
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
6667
import org.springdoc.core.filters.OpenApiMethodFilter;
6768
import org.springdoc.core.providers.ActuatorProvider;
6869
import org.springdoc.core.providers.CloudFunctionProvider;
@@ -685,6 +686,9 @@ public ResponseEntity<ErrorMessage> handleNoHandlerFound(OpenApiResourceNotFound
685686
* @param routerOperationCustomizers the router operation customizers
686687
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
687688
* @param methodFilters the method filters
689+
* @param globalOpenApiCustomizers the global open api customizers
690+
* @param globalOperationCustomizers the global operation customizers
691+
* @param globalOpenApiMethodFilters the global open api method filters
688692
* @return the spring doc customizers
689693
*/
690694
@Bean
@@ -694,11 +698,15 @@ public SpringDocCustomizers springDocCustomizers(Optional<List<OpenApiCustomiser
694698
Optional<List<OperationCustomizer>> operationCustomizers,
695699
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
696700
Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
697-
Optional<List<OpenApiMethodFilter>> methodFilters){
701+
Optional<List<OpenApiMethodFilter>> methodFilters, Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
702+
Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers,
703+
Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters){
698704
return new SpringDocCustomizers(openApiCustomizers,
699705
operationCustomizers,
700706
routerOperationCustomizers,
701707
dataRestRouterOperationCustomizers,
702-
methodFilters);
708+
methodFilters, globalOpenApiCustomizers,
709+
globalOperationCustomizers,
710+
globalOpenApiMethodFilters);
703711
}
704712
}

springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/SpringDocCustomizers.java

+82-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.Objects;
2929
import java.util.Optional;
3030

31+
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
3132
import org.springdoc.core.filters.OpenApiMethodFilter;
3233

3334
import org.springframework.beans.BeansException;
@@ -39,6 +40,8 @@
3940
import static org.springdoc.core.Constants.LINKS_SCHEMA_CUSTOMISER;
4041

4142
/**
43+
* The type Spring doc customizers.
44+
*
4245
* @author bnasslahsen
4346
*/
4447
public class SpringDocCustomizers implements ApplicationContextAware, InitializingBean {
@@ -65,6 +68,9 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
6568
private final Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers;
6669

6770

71+
/**
72+
* The Context.
73+
*/
6874
private ApplicationContext context;
6975

7076
/**
@@ -73,6 +79,21 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
7379
private final Optional<List<OpenApiMethodFilter>> methodFilters;
7480

7581

82+
/**
83+
* The Global open api customizers.
84+
*/
85+
private Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers;
86+
87+
/**
88+
* The Global operation customizers.
89+
*/
90+
private Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers;
91+
92+
/**
93+
* The Global open api method filters.
94+
*/
95+
private Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters;
96+
7697
/**
7798
* Instantiates a new Spring doc customizers.
7899
*
@@ -81,14 +102,22 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
81102
* @param routerOperationCustomizers the router operation customizers
82103
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
83104
* @param methodFilters the method filters
105+
* @param globalOpenApiCustomizers the global open api customizers
106+
* @param globalOperationCustomizers the global operation customizers
107+
* @param globalOpenApiMethodFilters the global open api method filters
84108
*/
85109
public SpringDocCustomizers(Optional<List<OpenApiCustomiser>> openApiCustomizers,
86110
Optional<List<OperationCustomizer>> operationCustomizers,
87111
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
88112
Optional<List<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
89-
Optional<List<OpenApiMethodFilter>> methodFilters) {
113+
Optional<List<OpenApiMethodFilter>> methodFilters, Optional<List<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
114+
Optional<List<GlobalOperationCustomizer>> globalOperationCustomizers,
115+
Optional<List<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
90116
this.openApiCustomizers = openApiCustomizers;
91117
this.operationCustomizers = operationCustomizers;
118+
this.globalOpenApiCustomizers = globalOpenApiCustomizers;
119+
this.globalOperationCustomizers = globalOperationCustomizers;
120+
this.globalOpenApiMethodFilters = globalOpenApiMethodFilters;
92121
operationCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
93122
this.routerOperationCustomizers = routerOperationCustomizers;
94123
this.dataRestRouterOperationCustomizers = dataRestRouterOperationCustomizers;
@@ -112,22 +141,47 @@ public SpringDocCustomizers(Optional<List<OpenApiCustomiser>> openApiCustomizers
112141
this.dataRestRouterOperationCustomizers = Optional.empty();
113142
}
114143

144+
/**
145+
* Gets open api customizers.
146+
*
147+
* @return the open api customizers
148+
*/
115149
public Optional<List<OpenApiCustomiser>> getOpenApiCustomizers() {
116150
return openApiCustomizers;
117151
}
118152

153+
/**
154+
* Gets operation customizers.
155+
*
156+
* @return the operation customizers
157+
*/
119158
public Optional<List<OperationCustomizer>> getOperationCustomizers() {
120159
return operationCustomizers;
121160
}
122161

162+
/**
163+
* Gets router operation customizers.
164+
*
165+
* @return the router operation customizers
166+
*/
123167
public Optional<List<RouterOperationCustomizer>> getRouterOperationCustomizers() {
124168
return routerOperationCustomizers;
125169
}
126170

171+
/**
172+
* Gets data rest router operation customizers.
173+
*
174+
* @return the data rest router operation customizers
175+
*/
127176
public Optional<List<DataRestRouterOperationCustomizer>> getDataRestRouterOperationCustomizers() {
128177
return dataRestRouterOperationCustomizers;
129178
}
130179

180+
/**
181+
* Gets method filters.
182+
*
183+
* @return the method filters
184+
*/
131185
public Optional<List<OpenApiMethodFilter>> getMethodFilters() {
132186
return methodFilters;
133187
}
@@ -144,4 +198,31 @@ public void afterPropertiesSet() {
144198
if (!CollectionUtils.isEmpty(existingOpenApiCustomizers) && existingOpenApiCustomizers.containsKey(LINKS_SCHEMA_CUSTOMISER))
145199
this.openApiCustomizers.ifPresent(openApiCustomizersList -> openApiCustomizersList.add(existingOpenApiCustomizers.get(LINKS_SCHEMA_CUSTOMISER)));
146200
}
201+
202+
/**
203+
* Gets global open api customizers.
204+
*
205+
* @return the global open api customizers
206+
*/
207+
public Optional<List<GlobalOpenApiCustomizer>> getGlobalOpenApiCustomizers() {
208+
return globalOpenApiCustomizers;
209+
}
210+
211+
/**
212+
* Gets global operation customizers.
213+
*
214+
* @return the global operation customizers
215+
*/
216+
public Optional<List<GlobalOperationCustomizer>> getGlobalOperationCustomizers() {
217+
return globalOperationCustomizers;
218+
}
219+
220+
/**
221+
* Gets global open api method filters.
222+
*
223+
* @return the global open api method filters
224+
*/
225+
public Optional<List<GlobalOpenApiMethodFilter>> getGlobalOpenApiMethodFilters() {
226+
return globalOpenApiMethodFilters;
227+
}
147228
}

springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityOAuth2Customizer.java

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
3535
import org.springframework.security.oauth2.server.authorization.OAuth2TokenIntrospection;
3636
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationConsentAuthenticationToken;
37-
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
3837
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
3938
import org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter;
4039
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter;

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiActuatorResource.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springdoc.core.OperationService;
3535
import org.springdoc.core.SpringDocConfigProperties;
3636
import org.springdoc.core.SpringDocProviders;
37+
import org.springdoc.core.customizers.SpringDocCustomizers;
3738
import reactor.core.publisher.Mono;
3839

3940
import org.springframework.beans.factory.ObjectFactory;
@@ -59,16 +60,20 @@ public class MultipleOpenApiActuatorResource extends MultipleOpenApiResource {
5960

6061
/**
6162
* Instantiates a new Multiple open api resource.
63+
*
6264
* @param groupedOpenApis the grouped open apis
6365
* @param defaultOpenAPIBuilder the default open api builder
6466
* @param requestBuilder the request builder
6567
* @param responseBuilder the response builder
6668
* @param operationParser the operation parser
6769
* @param springDocConfigProperties the spring doc config properties
6870
* @param springDocProviders the spring doc providers
71+
* @param springDocCustomizers the spring doc customizers
6972
*/
70-
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
71-
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders);
73+
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
74+
GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties,
75+
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
76+
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders, springDocCustomizers);
7277
}
7378

7479
/**

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiResource.java

+14-25
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,18 @@
3636
import org.springdoc.core.SpringDocConfigProperties;
3737
import org.springdoc.core.SpringDocConfigProperties.GroupConfig;
3838
import org.springdoc.core.SpringDocProviders;
39-
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
40-
import org.springdoc.core.customizers.GlobalOperationCustomizer;
4139
import org.springdoc.core.customizers.SpringDocCustomizers;
42-
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
4340

44-
import org.springframework.beans.BeansException;
4541
import org.springframework.beans.factory.InitializingBean;
4642
import org.springframework.beans.factory.ObjectFactory;
47-
import org.springframework.context.ApplicationContext;
48-
import org.springframework.context.ApplicationContextAware;
4943

5044
import static org.springdoc.core.Constants.ACTUATOR_DEFAULT_GROUP;
5145

5246
/**
5347
* The type Multiple open api resource.
5448
* @author bnasslahsen
5549
*/
56-
public abstract class MultipleOpenApiResource implements InitializingBean, ApplicationContextAware {
50+
public abstract class MultipleOpenApiResource implements InitializingBean {
5751

5852
/**
5953
* The Grouped open apis.
@@ -90,16 +84,15 @@ public abstract class MultipleOpenApiResource implements InitializingBean, Appli
9084
*/
9185
private final SpringDocProviders springDocProviders;
9286

93-
/**
94-
* The Application context.
95-
*/
96-
protected ApplicationContext applicationContext;
97-
9887
/**
9988
* The Grouped open api resources.
10089
*/
10190
private Map<String, OpenApiResource> groupedOpenApiResources;
10291

92+
/**
93+
* The Spring doc customizers.
94+
*/
95+
private final SpringDocCustomizers springDocCustomizers;
10396

10497
/**
10598
* Instantiates a new Multiple open api resource.
@@ -111,11 +104,13 @@ public abstract class MultipleOpenApiResource implements InitializingBean, Appli
111104
* @param operationParser the operation parser
112105
* @param springDocConfigProperties the spring doc config properties
113106
* @param springDocProviders the spring doc providers
107+
* @param springDocCustomizers the spring doc customizers
114108
*/
115109
protected MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
116110
ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
117111
GenericResponseService responseBuilder, OperationService operationParser,
118-
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
112+
SpringDocConfigProperties springDocConfigProperties,
113+
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
119114

120115
this.groupedOpenApis = groupedOpenApis;
121116
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
@@ -124,18 +119,16 @@ protected MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
124119
this.operationParser = operationParser;
125120
this.springDocConfigProperties = springDocConfigProperties;
126121
this.springDocProviders = springDocProviders;
122+
this.springDocCustomizers = springDocCustomizers;
127123
}
128124

129125
@Override
130126
public void afterPropertiesSet() {
131-
Map<String, GlobalOpenApiCustomizer> globalOpenApiCustomizerMap = applicationContext.getBeansOfType(GlobalOpenApiCustomizer.class);
132-
Map<String, GlobalOperationCustomizer> globalOperationCustomizerMap = applicationContext.getBeansOfType(GlobalOperationCustomizer.class);
133-
Map<String, GlobalOpenApiMethodFilter> globalOpenApiMethodFilterMap = applicationContext.getBeansOfType(GlobalOpenApiMethodFilter.class);
134-
135-
this.groupedOpenApis.forEach(groupedOpenApi -> groupedOpenApi
136-
.addAllOpenApiCustomizer(globalOpenApiCustomizerMap.values())
137-
.addAllOperationCustomizer(globalOperationCustomizerMap.values())
138-
.addAllOpenApiMethodFilter(globalOpenApiMethodFilterMap.values())
127+
this.groupedOpenApis.forEach(groupedOpenApi -> {
128+
springDocCustomizers.getGlobalOpenApiCustomizers().ifPresent(groupedOpenApi::addAllOpenApiCustomizer);
129+
springDocCustomizers.getGlobalOperationCustomizers().ifPresent(groupedOpenApi::addAllOperationCustomizer);
130+
springDocCustomizers.getGlobalOpenApiMethodFilters().ifPresent(groupedOpenApi::addAllOpenApiMethodFilter);
131+
}
139132
);
140133

141134
this.groupedOpenApiResources = groupedOpenApis.stream()
@@ -193,8 +186,4 @@ protected OpenApiResource getOpenApiResourceOrThrow(String group) {
193186
return openApiResource;
194187
}
195188

196-
@Override
197-
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
198-
this.applicationContext = applicationContext;
199-
}
200189
}

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/MultipleOpenApiWebFluxResource.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springdoc.core.OperationService;
3535
import org.springdoc.core.SpringDocConfigProperties;
3636
import org.springdoc.core.SpringDocProviders;
37+
import org.springdoc.core.customizers.SpringDocCustomizers;
3738
import reactor.core.publisher.Mono;
3839

3940
import org.springframework.beans.factory.ObjectFactory;
@@ -58,16 +59,20 @@ public class MultipleOpenApiWebFluxResource extends MultipleOpenApiResource {
5859

5960
/**
6061
* Instantiates a new Multiple open api resource.
62+
*
6163
* @param groupedOpenApis the grouped open apis
6264
* @param defaultOpenAPIBuilder the default open api builder
6365
* @param requestBuilder the request builder
6466
* @param responseBuilder the response builder
6567
* @param operationParser the operation parser
6668
* @param springDocConfigProperties the spring doc config properties
6769
* @param springDocProviders the spring doc providers
70+
* @param springDocCustomizers the spring doc customizers
6871
*/
69-
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
70-
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders);
72+
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
73+
GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties,
74+
SpringDocProviders springDocProviders, SpringDocCustomizers springDocCustomizers) {
75+
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, springDocProviders, springDocCustomizers);
7176
}
7277

7378
/**

0 commit comments

Comments
 (0)