Skip to content

Commit a1a9b96

Browse files
author
최현진[Plasma]
committed
Add RouterOperationCustomizer
Add new line at end of files Update to receive routerOperation as a return
1 parent 0dc49dd commit a1a9b96

File tree

26 files changed

+460
-40
lines changed

26 files changed

+460
-40
lines changed

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

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
import org.springdoc.core.customizers.OpenApiCustomiser;
8585
import org.springdoc.core.customizers.OpenApiLocaleCustomizer;
8686
import org.springdoc.core.customizers.OperationCustomizer;
87+
import org.springdoc.core.customizers.RouterOperationCustomizer;
8788
import org.springdoc.core.filters.OpenApiMethodFilter;
8889
import org.springdoc.core.fn.AbstractRouterFunctionVisitor;
8990
import org.springdoc.core.fn.RouterFunctionData;
@@ -119,6 +120,7 @@
119120
* The type Abstract open api resource.
120121
* @author bnasslahsen
121122
* @author kevinraddatz
123+
* @author hyeonisism
122124
*/
123125
public abstract class AbstractOpenApiResource extends SpecFilter {
124126

@@ -177,6 +179,11 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
177179
*/
178180
private final Optional<List<OperationCustomizer>> operationCustomizers;
179181

182+
/**
183+
* The RouterOperation customizers.
184+
*/
185+
private final Optional<List<RouterOperationCustomizer>> routerOperationCustomizers;
186+
180187
/**
181188
* The method filters to use.
182189
*/
@@ -216,6 +223,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
216223
* @param operationParser the operation parser
217224
* @param operationCustomizers the operation customizers
218225
* @param openApiCustomisers the open api customisers
226+
* @param routerOperationCustomizers the router operation customisers
219227
* @param methodFilters the method filters
220228
* @param springDocConfigProperties the spring doc config properties
221229
* @param springDocProviders the spring doc providers
@@ -225,6 +233,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
225233
GenericResponseService responseBuilder, OperationService operationParser,
226234
Optional<List<OperationCustomizer>> operationCustomizers,
227235
Optional<List<OpenApiCustomiser>> openApiCustomisers,
236+
Optional<List<RouterOperationCustomizer>> routerOperationCustomizers,
228237
Optional<List<OpenApiMethodFilter>> methodFilters,
229238
SpringDocConfigProperties springDocConfigProperties, SpringDocProviders springDocProviders) {
230239
super();
@@ -235,6 +244,7 @@ protected AbstractOpenApiResource(String groupName, ObjectFactory<OpenAPIService
235244
this.responseBuilder = responseBuilder;
236245
this.operationParser = operationParser;
237246
this.openApiCustomisers = openApiCustomisers;
247+
this.routerOperationCustomizers = routerOperationCustomizers;
238248
this.methodFilters = methodFilters;
239249
this.springDocProviders = springDocProviders;
240250
//add the default customizers
@@ -381,6 +391,9 @@ protected synchronized OpenAPI getOpenApi(Locale locale) {
381391
*/
382392
protected void calculatePath(HandlerMethod handlerMethod,
383393
RouterOperation routerOperation, Locale locale, OpenAPI openAPI) {
394+
395+
routerOperation = customiseRouterOperation(routerOperation, handlerMethod);
396+
384397
String operationPath = routerOperation.getPath();
385398
Set<RequestMethod> requestMethods = new HashSet<>(Arrays.asList(routerOperation.getMethods()));
386399
io.swagger.v3.oas.annotations.Operation apiOperation = routerOperation.getOperation();
@@ -608,12 +621,15 @@ protected void calculatePath(RouterOperation routerOperation, Locale locale, Ope
608621
* @param consumes the consumes
609622
* @param produces the produces
610623
* @param headers the headers
624+
* @param params the params
611625
* @param locale the locale
612626
* @param openAPI the open api
613627
*/
614628
protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
615-
Set<RequestMethod> requestMethods, String[] consumes, String[] produces, String[] headers, Locale locale, OpenAPI openAPI) {
616-
this.calculatePath(handlerMethod, new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers), locale, openAPI);
629+
Set<RequestMethod> requestMethods, String[] consumes, String[] produces, String[] headers, String[] params, Locale locale, OpenAPI openAPI) {
630+
this.calculatePath(handlerMethod,
631+
new RouterOperation(operationPath, requestMethods.toArray(new RequestMethod[requestMethods.size()]), consumes, produces, headers, params),
632+
locale, openAPI);
617633
}
618634

619635
/**
@@ -794,7 +810,6 @@ public static boolean containsResponseBody(HandlerMethod handlerMethod) {
794810
return responseBodyAnnotation != null;
795811
}
796812

797-
798813
/**
799814
* Is rest controller boolean.
800815
*
@@ -849,6 +864,22 @@ protected Operation customiseOperation(Operation operation, HandlerMethod handle
849864
return operation;
850865
}
851866

867+
/**
868+
* Customise router operation
869+
* @param routerOperation
870+
* @param handlerMethod
871+
* @return the router operation
872+
*/
873+
protected RouterOperation customiseRouterOperation(RouterOperation routerOperation, HandlerMethod handlerMethod) {
874+
if (routerOperationCustomizers.isPresent()) {
875+
List<RouterOperationCustomizer> routerOperationCustomizerList = routerOperationCustomizers.get();
876+
for (RouterOperationCustomizer routerOperationCustomizer : routerOperationCustomizerList) {
877+
routerOperation = routerOperationCustomizer.customize(routerOperation, handlerMethod);
878+
}
879+
}
880+
return routerOperation;
881+
}
882+
852883
/**
853884
* Merge routers.
854885
*

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.commons.lang3.StringUtils;
3232
import org.springdoc.core.customizers.OpenApiCustomiser;
3333
import org.springdoc.core.customizers.OperationCustomizer;
34+
import org.springdoc.core.customizers.RouterOperationCustomizer;
3435
import org.springdoc.core.filters.OpenApiMethodFilter;
3536

3637
import org.springframework.util.CollectionUtils;
@@ -58,6 +59,11 @@ public class GroupedOpenApi {
5859
*/
5960
private List<OperationCustomizer> operationCustomizers;
6061

62+
/**
63+
* The Router Operation customizers.
64+
*/
65+
private List<RouterOperationCustomizer> routerOperationCustomizers;
66+
6167
/**
6268
* The Paths to match.
6369
*/
@@ -120,6 +126,7 @@ private GroupedOpenApi(Builder builder) {
120126
this.displayName = StringUtils.defaultIfEmpty(builder.displayName, this.group);
121127
this.openApiCustomisers = Objects.requireNonNull(builder.openApiCustomisers);
122128
this.operationCustomizers = Objects.requireNonNull(builder.operationCustomizers);
129+
this.routerOperationCustomizers = Objects.requireNonNull(builder.routerOperationCustomizers);
123130
this.openApiMethodFilters = Objects.requireNonNull(builder.methodFilters);
124131
if (CollectionUtils.isEmpty(this.pathsToMatch)
125132
&& CollectionUtils.isEmpty(this.packagesToScan)
@@ -242,6 +249,15 @@ public List<OpenApiMethodFilter> getOpenApiMethodFilters() {
242249
return openApiMethodFilters;
243250
}
244251

252+
/**
253+
* Gets router operation customizers.
254+
*
255+
* @return the router operation customizers
256+
*/
257+
public List<RouterOperationCustomizer> getRouterOperationCustomizers() {
258+
return routerOperationCustomizers;
259+
}
260+
245261
/**
246262
* Gets display name.
247263
*
@@ -266,6 +282,11 @@ public static class Builder {
266282
*/
267283
private final List<OperationCustomizer> operationCustomizers = new ArrayList<>();
268284

285+
/**
286+
* The Router Operation customizers.
287+
*/
288+
private final List<RouterOperationCustomizer> routerOperationCustomizers = new ArrayList<>();
289+
269290
/**
270291
* The methods filters to apply.
271292
*/
@@ -433,6 +454,17 @@ public Builder addOperationCustomizer(OperationCustomizer operationCustomizer) {
433454
return this;
434455
}
435456

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

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
*
4040
* @author bnasslahsen
4141
*/
42-
@Target({ ElementType.TYPE, ElementType.METHOD})
42+
@Target({ ElementType.TYPE, ElementType.METHOD })
4343
@Retention(RetentionPolicy.RUNTIME)
4444
@Inherited
4545
public @interface RouterOperation {
@@ -95,6 +95,14 @@
9595
*/
9696
String[] headers() default {};
9797

98+
/**
99+
* The parameters of the mapped request, narrowing the primary mapping.
100+
* Same format for any environment: a sequence of "myParam=myValue" style expressions,
101+
* with a request only mapped if each such parameter is found to have the given value.
102+
* @return the string [ ]
103+
*/
104+
String[] params() default {};
105+
98106
/**
99107
* The class of the Handler bean.
100108
* @return the class of the Bean
Lines changed: 25 additions & 0 deletions
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-common/src/main/java/org/springdoc/core/fn/RouterFunctionData.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ public class RouterFunctionData {
6262
*/
6363
private List<String> headers = new ArrayList<>();
6464

65+
/**
66+
* The Params.
67+
*/
68+
private List<String> params = new ArrayList<>();
69+
6570
/**
6671
* The Query params.
6772
*/
@@ -93,6 +98,7 @@ public RouterFunctionData(String nestedOrPath, RouterFunctionData functionData)
9398
this.consumes = Arrays.asList(functionData.getConsumes());
9499
this.produces = Arrays.asList(functionData.getProduces());
95100
this.headers = Arrays.asList(functionData.getHeaders());
101+
this.params = Arrays.asList(functionData.getParams());
96102
this.queryParams = functionData.getQueryParams();
97103
this.methods = functionData.getMethods();
98104
this.attributes = functionData.getAttributes();
@@ -181,6 +187,20 @@ public String[] getConsumes() {
181187
return consumes.toArray(new String[consumes.size()]);
182188
}
183189

190+
/**
191+
* Get params string [ ].
192+
*
193+
* @return the string [ ]
194+
*/
195+
public String[] getParams() { return params.toArray(new String[params.size()]); }
196+
197+
/**
198+
* Add params.
199+
*
200+
* @param params the params
201+
*/
202+
public void addParams(String params) { if(StringUtils.isNotBlank(params)) this.params.add(params); }
203+
184204
/**
185205
* Add consumes.
186206
*

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
/**
3939
* The type Router operation.
4040
* @author bnasslahsen
41+
* @author hyeonisism
4142
*/
4243
public class RouterOperation implements Comparable<RouterOperation> {
4344

@@ -66,6 +67,11 @@ public class RouterOperation implements Comparable<RouterOperation> {
6667
*/
6768
private String[] headers;
6869

70+
/**
71+
* The Params.
72+
*/
73+
private String[] params;
74+
6975
/**
7076
* The Bean class.
7177
*/
@@ -116,6 +122,7 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
116122
this.parameterTypes = routerOperationAnnotation.parameterTypes();
117123
this.operation = routerOperationAnnotation.operation();
118124
this.headers = routerOperationAnnotation.headers();
125+
this.params = routerOperationAnnotation.params();
119126
}
120127

121128
/**
@@ -134,6 +141,7 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
134141
this.parameterTypes = routerOperationAnnotation.parameterTypes();
135142
this.operation = routerOperationAnnotation.operation();
136143
this.headers = ArrayUtils.isEmpty(routerOperationAnnotation.headers()) ? routerFunctionData.getHeaders() : routerOperationAnnotation.headers();
144+
this.params = routerOperationAnnotation.params();
137145
this.queryParams = routerFunctionData.getQueryParams();
138146
}
139147

@@ -146,12 +154,13 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
146154
* @param produces the produces
147155
* @param headers the headers
148156
*/
149-
public RouterOperation(String path, RequestMethod[] methods,String[] consumes, String[] produces, String[] headers) {
157+
public RouterOperation(String path, RequestMethod[] methods, String[] consumes, String[] produces, String[] headers, String[] params) {
150158
this.path = path;
151159
this.methods = methods;
152-
this.consumes=consumes;
153-
this.produces=produces;
154-
this.headers=headers;
160+
this.consumes = consumes;
161+
this.produces = produces;
162+
this.headers = headers;
163+
this.params = params;
155164
}
156165

157166
/**
@@ -165,6 +174,7 @@ public RouterOperation(RouterFunctionData routerFunctionData) {
165174
this.consumes = routerFunctionData.getConsumes();
166175
this.produces = routerFunctionData.getProduces();
167176
this.headers = routerFunctionData.getHeaders();
177+
this.params = routerFunctionData.getParams();
168178
this.queryParams = routerFunctionData.getQueryParams();
169179

170180
Map<String, Object> attributes = routerFunctionData.getAttributes();
@@ -369,6 +379,24 @@ public void setQueryParams(Map<String, String> queryParams) {
369379
this.queryParams = queryParams;
370380
}
371381

382+
/**
383+
* Gets params.
384+
*
385+
* @return the params
386+
*/
387+
public String[] getParams() {
388+
return this.params;
389+
}
390+
391+
/**
392+
* Sets params.
393+
*
394+
* @param params
395+
*/
396+
public void setParams(String[] params) {
397+
this.params = params;
398+
}
399+
372400
/**
373401
* Gets operation model.
374402
*

0 commit comments

Comments
 (0)