Skip to content

Commit 0463681

Browse files
committed
Changes report: #1706
1 parent c29fe57 commit 0463681

File tree

27 files changed

+462
-45
lines changed

27 files changed

+462
-45
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ Desktop.ini
127127
*.*~
128128
*~
129129
.merge_file*
130+
.java-version
130131

131132
######################
132133
# Gradle Wrapper

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
import org.springdoc.core.customizers.OpenApiCustomizer;
7575
import org.springdoc.core.customizers.OpenApiLocaleCustomizer;
7676
import org.springdoc.core.customizers.OperationCustomizer;
77+
import org.springdoc.core.customizers.RouterOperationCustomizer;
7778
import org.springdoc.core.filters.OpenApiMethodFilter;
7879
import org.springdoc.core.fn.AbstractRouterFunctionVisitor;
7980
import org.springdoc.core.fn.RouterFunctionData;
@@ -177,6 +178,10 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
177178
*/
178179
private final Optional<List<OperationCustomizer>> operationCustomizers;
179180

181+
/**
182+
* The RouterOperation customizers.
183+
*/
184+
private final Optional<List<RouterOperationCustomizer>> routerOperationCustomizers;
180185
/**
181186
* The method filters to use.
182187
*/
@@ -216,6 +221,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
216221
* @param operationParser the operation parser
217222
* @param operationCustomizers the operation customizers
218223
* @param openApiCustomizers the open api customisers
224+
* @param routerOperationCustomizers the router operation customisers
219225
* @param methodFilters the method filters
220226
* @param springDocConfigProperties the spring doc config properties
221227
* @param springDocProviders the spring doc providers
@@ -225,6 +231,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
225231
GenericResponseService responseBuilder, OperationService operationParser,
226232
Optional<List<OperationCustomizer>> operationCustomizers,
227233
Optional<List<OpenApiCustomizer>> openApiCustomizers,
234+
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
228235
Optional<List<OpenApiMethodFilter>> methodFilters,
229236
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
230237
super();
@@ -235,6 +242,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
235242
this.responseBuilder = responseBuilder;
236243
this.operationParser = operationParser;
237244
this.openApiCustomizers = openApiCustomizers;
245+
this.routerOperationCustomizers = routerOperationCustomizers;
238246
this.methodFilters = methodFilters;
239247
this.springDocProviders = springDocProviders;
240248
//add the default customizers
@@ -366,6 +374,8 @@ protected synchronized OpenAPI getOpenApi(Locale locale) {
366374
* @param openAPI the open api
367375
*/
368376
protected void calculatePath(HandlerMethod handlerMethod, RouterOperation routerOperation, Locale locale, OpenAPI openAPI) {
377+
routerOperation = customizeRouterOperation(routerOperation, handlerMethod);
378+
369379
String operationPath = routerOperation.getPath();
370380
Set<RequestMethod> requestMethods = new HashSet<>(Arrays.asList(routerOperation.getMethods()));
371381
io.swagger.v3.oas.annotations.Operation apiOperation = routerOperation.getOperation();
@@ -596,8 +606,8 @@ protected void calculatePath(RouterOperation routerOperation, Locale locale, Ope
596606
* @param locale the locale
597607
*/
598608
protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
599-
Set<RequestMethod> requestMethods,String[] consumes, String[] produces, String[] headers, Locale locale, OpenAPI openAPI) {
600-
this.calculatePath(handlerMethod, new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers), locale, openAPI);
609+
Set<RequestMethod> requestMethods,String[] consumes, String[] produces, String[] headers, String[] params,Locale locale, OpenAPI openAPI) {
610+
this.calculatePath(handlerMethod, new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers, params), locale, openAPI);
601611
}
602612

603613
/**
@@ -833,6 +843,21 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
833843
return operation;
834844
}
835845

846+
/**
847+
* Customise router operation
848+
* @param routerOperation
849+
* @param handlerMethod
850+
* @return the router operation
851+
*/
852+
protected RouterOperation customizeRouterOperation(RouterOperation routerOperation, HandlerMethod handlerMethod) {
853+
if (routerOperationCustomizers.isPresent()) {
854+
List<RouterOperationCustomizer> routerOperationCustomizerList = routerOperationCustomizers.get();
855+
for (RouterOperationCustomizer routerOperationCustomizer : routerOperationCustomizerList) {
856+
routerOperation = routerOperationCustomizer.customize(routerOperation, handlerMethod);
857+
}
858+
}
859+
return routerOperation;
860+
}
836861
/**
837862
* Merge routers.
838863
*

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/annotations/RouterOperation.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@
9797
*/
9898
String[] headers() default {};
9999

100+
/**
101+
* The parameters of the mapped request, narrowing the primary mapping.
102+
* Same format for any environment: a sequence of "myParam=myValue" style expressions,
103+
* with a request only mapped if each such parameter is found to have the given value.
104+
* @return the string [ ]
105+
*/
106+
String[] params() default {};
107+
100108
/**
101109
* The class of the Handler bean.
102110
* @return the class of the Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.springdoc.core.customizers;
2+
3+
import org.springdoc.core.fn.RouterOperation;
4+
5+
import org.springframework.web.method.HandlerMethod;
6+
7+
/**
8+
* Implement and register a bean of type {@link RouterOperationCustomizer} to customize an router operation
9+
* based on the handler method input on default OpenAPI descriptions but not groups
10+
*
11+
* @author hyeonisism
12+
*/
13+
@FunctionalInterface
14+
public interface RouterOperationCustomizer {
15+
16+
/**
17+
* Customize router operation.
18+
*
19+
* @param routerOperation input operation
20+
* @param handlerMethod original handler method
21+
* @return customized router operation
22+
*/
23+
RouterOperation customize(RouterOperation routerOperation, HandlerMethod handlerMethod);
24+
25+
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/data/DataRestRouterOperationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ else if (ControllerType.PROPERTY.equals(controllerType))
281281
MethodResourceMapping methodResourceMapping, HandlerMethod handlerMethod,
282282
RequestMethod requestMethod, ResourceMetadata resourceMetadata, String
283283
operationPath, ControllerType controllerType) {
284-
RouterOperation routerOperation = new RouterOperation(operationPath, new RequestMethod[] { requestMethod }, null, null, null);
284+
RouterOperation routerOperation = new RouterOperation(operationPath, new RequestMethod[] { requestMethod }, null, null, null,null);
285285
MethodAttributes methodAttributes = new MethodAttributes(springDocConfigProperties.getDefaultConsumesMediaType(), springDocConfigProperties.getDefaultProducesMediaType(), dataRestRepository.getLocale());
286286
methodAttributes.calculateConsumesProduces(handlerMethod.getMethod());
287287
routerOperation.setConsumes(methodAttributes.getMethodConsumes());

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/fn/RouterFunctionData.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
*/
4545
public class RouterFunctionData {
4646

47+
4748
/**
4849
* The Path.
4950
*/
@@ -64,6 +65,11 @@ public class RouterFunctionData {
6465
*/
6566
private List<String> headers = new ArrayList<>();
6667

68+
/**
69+
* The Params.
70+
*/
71+
private List<String> params = new ArrayList<>();
72+
6773
/**
6874
* The Query params.
6975
*/
@@ -77,13 +83,12 @@ public class RouterFunctionData {
7783
/**
7884
* The Attributes.
7985
*/
80-
private Map<String, Object> attributes = new LinkedHashMap<>();
86+
private Map<String,Object> attributes = new LinkedHashMap<>();
8187

8288
/**
8389
* Instantiates a new Router function data.
8490
*/
85-
public RouterFunctionData() {
86-
}
91+
public RouterFunctionData() { }
8792

8893
/**
8994
* Instantiates a new Router function data.
@@ -96,6 +101,7 @@ public RouterFunctionData(String nestedOrPath, RouterFunctionData functionData)
96101
this.consumes = Arrays.asList(functionData.getConsumes());
97102
this.produces = Arrays.asList(functionData.getProduces());
98103
this.headers = Arrays.asList(functionData.getHeaders());
104+
this.params = Arrays.asList(functionData.getParams());
99105
this.queryParams = functionData.getQueryParams();
100106
this.methods = functionData.getMethods();
101107
this.attributes = functionData.getAttributes();
@@ -184,6 +190,20 @@ public String[] getConsumes() {
184190
return consumes.toArray(new String[consumes.size()]);
185191
}
186192

193+
/**
194+
* Get params string [ ].
195+
*
196+
* @return the string [ ]
197+
*/
198+
public String[] getParams() { return params.toArray(new String[params.size()]); }
199+
200+
/**
201+
* Add params.
202+
*
203+
* @param params the params
204+
*/
205+
public void addParams(String params) { if(StringUtils.isNotBlank(params)) this.params.add(params); }
206+
187207
/**
188208
* Add consumes.
189209
*

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/fn/RouterOperation.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
package org.springdoc.core.fn;
2626

27+
2728
import java.util.Arrays;
2829
import java.util.Map;
2930
import java.util.Objects;
@@ -68,6 +69,11 @@ public class RouterOperation implements Comparable<RouterOperation> {
6869
*/
6970
private String[] headers;
7071

72+
/**
73+
* The Params.
74+
*/
75+
private String[] params;
76+
7177
/**
7278
* The Bean class.
7379
*/
@@ -118,6 +124,7 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
118124
this.parameterTypes = routerOperationAnnotation.parameterTypes();
119125
this.operation = routerOperationAnnotation.operation();
120126
this.headers = routerOperationAnnotation.headers();
127+
this.params = routerOperationAnnotation.params();
121128
}
122129

123130
/**
@@ -136,6 +143,7 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
136143
this.parameterTypes = routerOperationAnnotation.parameterTypes();
137144
this.operation = routerOperationAnnotation.operation();
138145
this.headers = ArrayUtils.isEmpty(routerOperationAnnotation.headers()) ? routerFunctionData.getHeaders() : routerOperationAnnotation.headers();
146+
this.params = routerOperationAnnotation.params();
139147
this.queryParams = routerFunctionData.getQueryParams();
140148
}
141149

@@ -148,12 +156,13 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
148156
* @param produces the produces
149157
* @param headers the headers
150158
*/
151-
public RouterOperation(String path, RequestMethod[] methods,String[] consumes, String[] produces, String[] headers) {
159+
public RouterOperation(String path, RequestMethod[] methods, String[] consumes, String[] produces, String[] headers, String[] params) {
152160
this.path = path;
153161
this.methods = methods;
154-
this.consumes=consumes;
155-
this.produces=produces;
156-
this.headers=headers;
162+
this.consumes = consumes;
163+
this.produces = produces;
164+
this.headers = headers;
165+
this.params = params;
157166
}
158167

159168
/**
@@ -167,6 +176,7 @@ public RouterOperation(RouterFunctionData routerFunctionData) {
167176
this.consumes = routerFunctionData.getConsumes();
168177
this.produces = routerFunctionData.getProduces();
169178
this.headers = routerFunctionData.getHeaders();
179+
this.params = routerFunctionData.getParams();
170180
this.queryParams = routerFunctionData.getQueryParams();
171181

172182
Map<String, Object> attributes = routerFunctionData.getAttributes();
@@ -371,6 +381,24 @@ public void setQueryParams(Map<String, String> queryParams) {
371381
this.queryParams = queryParams;
372382
}
373383

384+
/**
385+
* Gets params.
386+
*
387+
* @return the params
388+
*/
389+
public String[] getParams() {
390+
return this.params;
391+
}
392+
393+
/**
394+
* Sets params.
395+
*
396+
* @param params
397+
*/
398+
public void setParams(String[] params) {
399+
this.params = params;
400+
}
401+
374402
/**
375403
* Gets operation model.
376404
*
@@ -411,6 +439,7 @@ public boolean equals(Object o) {
411439
Arrays.equals(consumes, that.consumes) &&
412440
Arrays.equals(produces, that.produces) &&
413441
Arrays.equals(headers, that.headers) &&
442+
Arrays.equals(params, that.params) &&
414443
Objects.equals(beanClass, that.beanClass) &&
415444
Objects.equals(beanMethod, that.beanMethod) &&
416445
Arrays.equals(parameterTypes, that.parameterTypes) &&
@@ -423,6 +452,7 @@ public boolean equals(Object o) {
423452
public int hashCode() {
424453
int result = Objects.hash(path, beanClass, beanMethod, queryParams, operation, operationModel);
425454
result = 31 * result + Arrays.hashCode(methods);
455+
result = 31 * result + Arrays.hashCode(params);
426456
result = 31 * result + Arrays.hashCode(consumes);
427457
result = 31 * result + Arrays.hashCode(produces);
428458
result = 31 * result + Arrays.hashCode(headers);

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/models/GroupedOpenApi.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.commons.lang3.StringUtils;
3434
import org.springdoc.core.customizers.OpenApiCustomizer;
3535
import org.springdoc.core.customizers.OperationCustomizer;
36+
import org.springdoc.core.customizers.RouterOperationCustomizer;
3637
import org.springdoc.core.filters.OpenApiMethodFilter;
3738

3839
import org.springframework.util.CollectionUtils;
@@ -60,6 +61,11 @@ public class GroupedOpenApi {
6061
*/
6162
private List<OperationCustomizer> operationCustomizers;
6263

64+
/**
65+
* The Router Operation customizers.
66+
*/
67+
private List<RouterOperationCustomizer> routerOperationCustomizers;
68+
6369
/**
6470
* The Paths to match.
6571
*/
@@ -122,6 +128,7 @@ private GroupedOpenApi(Builder builder) {
122128
this.displayName = StringUtils.defaultIfEmpty(builder.displayName, this.group);
123129
this.openApiCustomizers = Objects.requireNonNull(builder.openApiCustomizers);
124130
this.operationCustomizers = Objects.requireNonNull(builder.operationCustomizers);
131+
this.routerOperationCustomizers = Objects.requireNonNull(builder.routerOperationCustomizers);
125132
this.openApiMethodFilters = Objects.requireNonNull(builder.methodFilters);
126133
if (CollectionUtils.isEmpty(this.pathsToMatch)
127134
&& CollectionUtils.isEmpty(this.packagesToScan)
@@ -244,6 +251,15 @@ public List<OpenApiMethodFilter> getOpenApiMethodFilters() {
244251
return openApiMethodFilters;
245252
}
246253

254+
/**
255+
* Gets router operation customizers.
256+
*
257+
* @return the router operation customizers
258+
*/
259+
public List<RouterOperationCustomizer> getRouterOperationCustomizers() {
260+
return routerOperationCustomizers;
261+
}
262+
247263
/**
248264
* Gets display name.
249265
*
@@ -268,6 +284,11 @@ public static class Builder {
268284
*/
269285
private final List<OperationCustomizer> operationCustomizers = new ArrayList<>();
270286

287+
/**
288+
* The Router Operation customizers.
289+
*/
290+
private final List<RouterOperationCustomizer> routerOperationCustomizers = new ArrayList<>();
291+
271292
/**
272293
* The methods filters to apply.
273294
*/
@@ -435,6 +456,17 @@ public Builder addOperationCustomizer(OperationCustomizer operationCustomizer) {
435456
return this;
436457
}
437458

459+
/**
460+
* Add router operation customizer builder
461+
*
462+
* @param routerOperationCustomizer the router operation customizer
463+
* @return the builder
464+
*/
465+
public Builder addRouterOperationCustomizer(RouterOperationCustomizer routerOperationCustomizer) {
466+
this.routerOperationCustomizers.add(routerOperationCustomizer);
467+
return this;
468+
}
469+
438470
/**
439471
* Add method filter.
440472
*

0 commit comments

Comments
 (0)