Skip to content

Commit 36e609d

Browse files
author
bnasslahsen
committed
use ObjectFactory<OpenAPIBuilder> inside AbstractOpenApiResource
1 parent 331e3e0 commit 36e609d

File tree

9 files changed

+48
-29
lines changed

9 files changed

+48
-29
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import org.springdoc.core.fn.RouterFunctionData;
7575
import org.springdoc.core.fn.RouterOperation;
7676

77+
import org.springframework.beans.factory.ObjectFactory;
7778
import org.springframework.context.ApplicationContext;
7879
import org.springframework.core.annotation.AnnotatedElementUtils;
7980
import org.springframework.core.annotation.AnnotationUtils;
@@ -110,7 +111,12 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
110111
/**
111112
* The Open api builder.
112113
*/
113-
protected final OpenAPIBuilder openAPIBuilder;
114+
protected OpenAPIBuilder openAPIBuilder;
115+
116+
/**
117+
* The open api builder object factory.
118+
*/
119+
private final ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory;
114120

115121
/**
116122
* The Spring doc config properties.
@@ -161,7 +167,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
161167
* Instantiates a new Abstract open api resource.
162168
*
163169
* @param groupName the group name
164-
* @param openAPIBuilder the open api builder
170+
* @param openAPIBuilderObjectFactory the open api builder object factory
165171
* @param requestBuilder the request builder
166172
* @param responseBuilder the response builder
167173
* @param operationParser the operation parser
@@ -170,7 +176,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
170176
* @param springDocConfigProperties the spring doc config properties
171177
* @param actuatorProvider the actuator provider
172178
*/
173-
protected AbstractOpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder,
179+
protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory,
174180
AbstractRequestBuilder requestBuilder,
175181
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
176182
Optional<List<OperationCustomizer>> operationCustomizers,
@@ -179,7 +185,8 @@ protected AbstractOpenApiResource(String groupName, OpenAPIBuilder openAPIBuilde
179185
Optional<ActuatorProvider> actuatorProvider) {
180186
super();
181187
this.groupName = Objects.requireNonNull(groupName, "groupName");
182-
this.openAPIBuilder = openAPIBuilder;
188+
this.openAPIBuilderObjectFactory = openAPIBuilderObjectFactory;
189+
this.openAPIBuilder = openAPIBuilderObjectFactory.getObject();
183190
this.requestBuilder = requestBuilder;
184191
this.responseBuilder = responseBuilder;
185192
this.operationParser = operationParser;
@@ -933,4 +940,9 @@ else if (existingOperation != null) {
933940
return operation;
934941
}
935942

943+
protected void initOpenAPIBuilder() {
944+
if (openAPIBuilder.getCachedOpenAPI() != null && springDocConfigProperties.isCacheDisabled()) {
945+
openAPIBuilder = openAPIBuilderObjectFactory.getObject();
946+
}
947+
}
936948
}

springdoc-openapi-hateoas/src/test/java/test/org/springdoc/api/app5/controller/CompanyController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import lombok.RequiredArgsConstructor;
88
import test.org.springdoc.api.app5.entities.CompanyDto;
99

10-
import org.springframework.http.MediaType;
1110
import org.springframework.web.bind.annotation.PostMapping;
1211
import org.springframework.web.bind.annotation.RequestBody;
1312
import org.springframework.web.bind.annotation.RestController;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public void afterPropertiesSet() throws Exception {
140140
GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude());
141141
springDocConfigProperties.addGroupConfig(groupConfig);
142142
return new OpenApiResource(item.getGroup(),
143-
defaultOpenAPIBuilder.getObject(),
143+
defaultOpenAPIBuilder,
144144
requestBuilder,
145145
responseBuilder,
146146
operationParser,

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.springdoc.webflux.core.visitor.RouterFunctionVisitor;
4646
import reactor.core.publisher.Mono;
4747

48+
import org.springframework.beans.factory.ObjectFactory;
4849
import org.springframework.beans.factory.annotation.Autowired;
4950
import org.springframework.beans.factory.annotation.Value;
5051
import org.springframework.context.ApplicationContext;
@@ -82,7 +83,7 @@ public class OpenApiResource extends AbstractOpenApiResource {
8283
* Instantiates a new Open api resource.
8384
*
8485
* @param groupName the group name
85-
* @param openAPIBuilder the open api builder
86+
* @param openAPIBuilderObjectFactory the open api builder object factory
8687
* @param requestBuilder the request builder
8788
* @param responseBuilder the response builder
8889
* @param operationParser the operation parser
@@ -92,21 +93,21 @@ public class OpenApiResource extends AbstractOpenApiResource {
9293
* @param springDocConfigProperties the spring doc config properties
9394
* @param actuatorProvider the actuator provider
9495
*/
95-
public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
96+
public OpenApiResource(String groupName, ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
9697
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
9798
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
9899
Optional<List<OperationCustomizer>> operationCustomizers,
99100
Optional<List<OpenApiCustomiser>> openApiCustomisers,
100101
SpringDocConfigProperties springDocConfigProperties,
101102
Optional<ActuatorProvider> actuatorProvider) {
102-
super(groupName, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
103+
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
103104
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
104105
}
105106

106107
/**
107108
* Instantiates a new Open api resource.
108109
*
109-
* @param openAPIBuilder the open api builder
110+
* @param openAPIBuilderObjectFactory the open api builder object factory
110111
* @param requestBuilder the request builder
111112
* @param responseBuilder the response builder
112113
* @param operationParser the operation parser
@@ -117,14 +118,14 @@ public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, Abstract
117118
* @param actuatorProvider the actuator provider
118119
*/
119120
@Autowired
120-
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
121+
public OpenApiResource(ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
121122
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
122123
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
123124
Optional<List<OperationCustomizer>> operationCustomizers,
124125
Optional<List<OpenApiCustomiser>> openApiCustomisers,
125126
SpringDocConfigProperties springDocConfigProperties,
126127
Optional<ActuatorProvider> actuatorProvider) {
127-
super(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
128+
super(DEFAULT_GROUP_NAME, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
128129
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
129130
}
130131

@@ -197,8 +198,8 @@ protected void calculatePath(Map<String, Object> restControllers, Map<RequestMap
197198
Map<String, String> regexMap = new LinkedHashMap<>();
198199
operationPath = PathUtils.parsePath(operationPath, regexMap);
199200
if (operationPath.startsWith(DEFAULT_PATH_SEPARATOR)
200-
&& (restControllers.containsKey(handlerMethod.getBean().toString()) || actuatorProvider.isPresent())
201-
&& isPackageToScan(handlerMethod.getBeanType().getPackage()) && isPathToMatch(operationPath)) {
201+
&& (restControllers.containsKey(handlerMethod.getBean().toString()) || actuatorProvider.isPresent())
202+
&& isPackageToScan(handlerMethod.getBeanType().getPackage()) && isPathToMatch(operationPath)) {
202203
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
203204
// default allowed requestmethods
204205
if (requestMethods.isEmpty())
@@ -230,6 +231,7 @@ protected void getWebFluxRouterFunctionPaths() {
230231
* @param apiDocsUrl the api docs url
231232
*/
232233
protected void calculateServerUrl(ServerHttpRequest serverHttpRequest, String apiDocsUrl) {
234+
super.initOpenAPIBuilder();
233235
String requestUrl = decode(serverHttpRequest.getURI().toString());
234236
String serverBaseUrl = requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length());
235237
openAPIBuilder.setServerBaseUrl(serverBaseUrl);

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springdoc.webflux.api.OpenApiResource;
4141
import org.springdoc.webflux.core.converters.WebFluxSupportConverter;
4242

43+
import org.springframework.beans.factory.ObjectFactory;
4344
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
4445
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
4546
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
@@ -68,7 +69,7 @@ public class SpringDocWebFluxConfiguration {
6869
/**
6970
* Open api resource open api resource.
7071
*
71-
* @param openAPIBuilder the open api builder
72+
* @param openAPIBuilderObjectFactory the open api builder object factory
7273
* @param requestBuilder the request builder
7374
* @param responseBuilder the response builder
7475
* @param operationParser the operation parser
@@ -82,14 +83,14 @@ public class SpringDocWebFluxConfiguration {
8283
@Bean
8384
@ConditionalOnMissingBean
8485
@Lazy(false)
85-
OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
86+
OpenApiResource openApiResource(ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
8687
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
8788
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
8889
Optional<List<OperationCustomizer>> operationCustomizers,
8990
Optional<List<OpenApiCustomiser>> openApiCustomisers,
9091
SpringDocConfigProperties springDocConfigProperties,
9192
Optional<ActuatorProvider> actuatorProvider) {
92-
return new OpenApiResource(openAPIBuilder, requestBuilder,
93+
return new OpenApiResource(openAPIBuilderObjectFactory, requestBuilder,
9394
responseBuilder, operationParser,
9495
requestMappingHandlerMapping,operationCustomizers,
9596
openApiCustomisers, springDocConfigProperties,actuatorProvider);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public void afterPropertiesSet() throws Exception {
165165
GroupConfig groupConfig = new GroupConfig(item.getGroup(), item.getPathsToMatch(), item.getPackagesToScan(), item.getPackagesToExclude(), item.getPathsToExclude());
166166
springDocConfigProperties.addGroupConfig(groupConfig);
167167
return new OpenApiResource(item.getGroup(),
168-
defaultOpenAPIBuilder.getObject(),
168+
defaultOpenAPIBuilder,
169169
requestBuilder,
170170
responseBuilder,
171171
operationParser,

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/OpenApiResource.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.springdoc.core.customizers.OperationCustomizer;
4949
import org.springdoc.core.fn.RouterOperation;
5050

51+
import org.springframework.beans.factory.ObjectFactory;
5152
import org.springframework.beans.factory.annotation.Autowired;
5253
import org.springframework.beans.factory.annotation.Value;
5354
import org.springframework.core.annotation.AnnotationUtils;
@@ -99,7 +100,7 @@ public class OpenApiResource extends AbstractOpenApiResource {
99100
* Instantiates a new Open api resource.
100101
*
101102
* @param groupName the group name
102-
* @param openAPIBuilder the open api builder
103+
* @param openAPIBuilderObjectFactory the open api builder object factory
103104
* @param requestBuilder the request builder
104105
* @param responseBuilder the response builder
105106
* @param operationParser the operation parser
@@ -112,7 +113,7 @@ public class OpenApiResource extends AbstractOpenApiResource {
112113
* @param routerFunctionProvider the router function provider
113114
* @param repositoryRestResourceProvider the repository rest resource provider
114115
*/
115-
public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
116+
public OpenApiResource(String groupName, ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
116117
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
117118
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
118119
Optional<ActuatorProvider> actuatorProvider,
@@ -122,7 +123,7 @@ public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, Abstract
122123
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
123124
Optional<RouterFunctionProvider> routerFunctionProvider,
124125
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider) {
125-
super(groupName, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
126+
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
126127
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
127128
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
128129
this.routerFunctionProvider = routerFunctionProvider;
@@ -132,7 +133,7 @@ public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, Abstract
132133
/**
133134
* Instantiates a new Open api resource.
134135
*
135-
* @param openAPIBuilder the open api builder
136+
* @param openAPIBuilderObjectFactory the open api builder object factory
136137
* @param requestBuilder the request builder
137138
* @param responseBuilder the response builder
138139
* @param operationParser the operation parser
@@ -146,7 +147,7 @@ public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, Abstract
146147
* @param repositoryRestResourceProvider the repository rest resource provider
147148
*/
148149
@Autowired
149-
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
150+
public OpenApiResource(ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
150151
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
151152
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
152153
Optional<ActuatorProvider> actuatorProvider,
@@ -156,7 +157,7 @@ public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder req
156157
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
157158
Optional<RouterFunctionProvider> routerFunctionProvider,
158159
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider) {
159-
super(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
160+
super(DEFAULT_GROUP_NAME, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties,actuatorProvider);
160161
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
161162
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
162163
this.routerFunctionProvider = routerFunctionProvider;
@@ -288,8 +289,10 @@ protected boolean isRestController(Map<String, Object> restControllers, HandlerM
288289
* @param apiDocsUrl the api docs url
289290
*/
290291
protected void calculateServerUrl(HttpServletRequest request, String apiDocsUrl) {
292+
super.initOpenAPIBuilder();
291293
String requestUrl = decode(request.getRequestURL().toString());
292294
String calculatedUrl = requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length());
293295
openAPIBuilder.setServerBaseUrl(calculatedUrl);
294296
}
297+
295298
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springdoc.webmvc.api.RouterFunctionProvider;
4444
import org.springdoc.webmvc.api.WebMvcActuatorProvider;
4545

46+
import org.springframework.beans.factory.ObjectFactory;
4647
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
4748
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
4849
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
@@ -73,7 +74,7 @@ public class SpringDocWebMvcConfiguration {
7374
/**
7475
* Open api resource open api resource.
7576
*
76-
* @param openAPIBuilder the open api builder
77+
* @param openAPIBuilderObjectFactory the open api builder object factory
7778
* @param requestBuilder the request builder
7879
* @param responseBuilder the response builder
7980
* @param operationParser the operation parser
@@ -90,7 +91,7 @@ public class SpringDocWebMvcConfiguration {
9091
@Bean
9192
@ConditionalOnMissingBean
9293
@Lazy(false)
93-
OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
94+
OpenApiResource openApiResource(ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder,
9495
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
9596
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
9697
Optional<ActuatorProvider> actuatorProvider,
@@ -100,7 +101,7 @@ OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBu
100101
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
101102
Optional<RouterFunctionProvider> routerFunctionProvider,
102103
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider) {
103-
return new OpenApiResource(openAPIBuilder, requestBuilder,
104+
return new OpenApiResource(openAPIBuilderObjectFactory, requestBuilder,
104105
responseBuilder, operationParser,
105106
requestMappingHandlerMapping, actuatorProvider, operationCustomizers,
106107
openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider,

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app94/SpringDocApp94Test.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import test.org.springdoc.api.app91.Greeting;
4545

4646
import org.springframework.beans.BeansException;
47+
import org.springframework.beans.factory.ObjectFactory;
4748
import org.springframework.beans.factory.annotation.Qualifier;
4849
import org.springframework.boot.autoconfigure.SpringBootApplication;
4950
import org.springframework.context.ApplicationContext;
@@ -92,13 +93,13 @@ public RequestMappingHandlerMapping defaultTestHandlerMapping(GreetingController
9293
}
9394

9495
@Bean(name = "openApiResource")
95-
public OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder, GenericResponseBuilder responseBuilder,
96+
public OpenApiResource openApiResource(ObjectFactory<OpenAPIBuilder> openAPIBuilderObjectFactory, AbstractRequestBuilder requestBuilder, GenericResponseBuilder responseBuilder,
9697
OperationBuilder operationParser,Optional<List<OperationCustomizer>> operationCustomizers,
9798
@Qualifier("defaultTestHandlerMapping") RequestMappingHandlerMapping requestMappingHandlerMapping,
9899
Optional<ActuatorProvider> actuatorProvider, SpringDocConfigProperties springDocConfigProperties,
99100
Optional<List<OpenApiCustomiser>> openApiCustomisers, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
100101
Optional<RouterFunctionProvider> routerFunctionProvider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider) {
101-
return new OpenApiResource(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping,
102+
return new OpenApiResource(DEFAULT_GROUP_NAME, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping,
102103
actuatorProvider,operationCustomizers, openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider,routerFunctionProvider, repositoryRestResourceProvider);
103104
}
104105

0 commit comments

Comments
 (0)