Skip to content

Commit ea081d0

Browse files
author
springdoc
committed
method overloaded
1 parent cd40ce0 commit ea081d0

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

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

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springdoc.core.OperationBuilder;
1919
import org.springdoc.core.RequestBodyBuilder;
2020
import org.springframework.core.annotation.AnnotationUtils;
21+
import org.springframework.util.CollectionUtils;
2122
import org.springframework.web.bind.annotation.RequestMapping;
2223
import org.springframework.web.bind.annotation.RequestMethod;
2324
import org.springframework.web.method.HandlerMethod;
@@ -28,6 +29,7 @@
2829
import io.swagger.v3.oas.models.OpenAPI;
2930
import io.swagger.v3.oas.models.Operation;
3031
import io.swagger.v3.oas.models.PathItem;
32+
import io.swagger.v3.oas.models.PathItem.HttpMethod;
3133
import io.swagger.v3.oas.models.Paths;
3234
import io.swagger.v3.oas.models.responses.ApiResponses;
3335

@@ -40,6 +42,7 @@ public abstract class AbstractOpenApiResource {
4042
protected OperationBuilder operationParser;
4143
protected RequestBodyBuilder requestBodyBuilder;
4244
protected GeneralInfoBuilder generalInfoBuilder;
45+
public static boolean methodOverloaded;
4346

4447
protected AbstractOpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
4548
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
@@ -81,7 +84,41 @@ protected void calculatePath(OpenAPIBuilder openAPIBuilder, HandlerMethod handle
8184
Components components = openAPIBuilder.getComponents();
8285
Paths paths = openAPIBuilder.getPaths();
8386

87+
Map<HttpMethod, Operation> operationMap = null;
88+
if (paths.containsKey(operationPath)) {
89+
PathItem pathItem = paths.get(operationPath);
90+
operationMap = pathItem.readOperationsMap();
91+
}
92+
8493
for (RequestMethod requestMethod : requestMethods) {
94+
95+
Operation existingOperation = null;
96+
if (!CollectionUtils.isEmpty(operationMap)) {
97+
// Get existing operation definition
98+
if (RequestMethod.GET.equals(requestMethod)) {
99+
existingOperation = operationMap.get(HttpMethod.GET);
100+
} else if (RequestMethod.POST.equals(requestMethod)) {
101+
existingOperation = operationMap.get(HttpMethod.POST);
102+
} else if (RequestMethod.PUT.equals(requestMethod)) {
103+
existingOperation = operationMap.get(HttpMethod.PUT);
104+
} else if (RequestMethod.DELETE.equals(requestMethod)) {
105+
existingOperation = operationMap.get(HttpMethod.DELETE);
106+
} else if (RequestMethod.PATCH.equals(requestMethod)) {
107+
existingOperation = operationMap.get(HttpMethod.PATCH);
108+
} else if (RequestMethod.TRACE.equals(requestMethod)) {
109+
existingOperation = operationMap.get(HttpMethod.TRACE);
110+
} else if (RequestMethod.HEAD.equals(requestMethod)) {
111+
existingOperation = operationMap.get(HttpMethod.HEAD);
112+
} else if (RequestMethod.OPTIONS.equals(requestMethod)) {
113+
existingOperation = operationMap.get(HttpMethod.OPTIONS);
114+
}
115+
}
116+
117+
if (existingOperation != null) {
118+
methodOverloaded = true;
119+
}
120+
else
121+
methodOverloaded = false;
85122
// skip hidden operations
86123
if (operationParser.isHidden(handlerMethod.getMethod())) {
87124
continue;
@@ -98,7 +135,7 @@ protected void calculatePath(OpenAPIBuilder openAPIBuilder, HandlerMethod handle
98135

99136
mediaAttributes.calculateConsumesProduces(handlerMethod.getMethod());
100137

101-
Operation operation = new Operation();
138+
Operation operation = (existingOperation != null) ? existingOperation : new Operation();
102139

103140
// compute tags
104141
operation = generalInfoBuilder.buildTags(handlerMethod, operation, openAPI);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
import org.apache.commons.lang3.ArrayUtils;
1515
import org.apache.commons.lang3.StringUtils;
16+
import org.springdoc.api.AbstractOpenApiResource;
1617
import org.springframework.core.annotation.AnnotatedElementUtils;
1718
import org.springframework.http.HttpStatus;
1819
import org.springframework.http.MediaType;
@@ -237,7 +238,7 @@ private void buildApiResponses(Components components, Method method, ApiResponse
237238
if (StringUtils.isBlank(apiResponse.getDescription())) {
238239
apiResponse.setDescription(DEFAULT_DESCRIPTION);
239240
}
240-
if (apiResponse.getContent() != null && isGeneric) {
241+
if (apiResponse.getContent() != null && (isGeneric || AbstractOpenApiResource.methodOverloaded)) {
241242
// Merge with existing schema
242243
Content existingContent = apiResponse.getContent();
243244
Schema<?> schemaN = calculateSchema(components, method.getGenericReturnType());

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Optional;
77

88
import org.apache.commons.lang3.StringUtils;
9+
import org.springdoc.api.AbstractOpenApiResource;
910
import org.springframework.stereotype.Component;
1011
import org.springframework.web.bind.annotation.RequestPart;
1112
import org.springframework.web.method.HandlerMethod;
@@ -108,12 +109,22 @@ private RequestBody buildRequestBody(RequestBody requestBody, Components compone
108109
if (requestBody == null)
109110
requestBody = new RequestBody();
110111

111-
if (requestBody.getContent() == null) {
112+
if (requestBody.getContent() == null
113+
|| (requestBody.getContent() != null && AbstractOpenApiResource.methodOverloaded)) {
114+
112115
Schema<?> schema = parameterBuilder.calculateSchema(components, parameterInfo.getParameter(),
113116
parameterInfo.getpName(), null, requestBodyInfo);
114-
Content content = new Content();
115-
for (String value : allConsumes) {
116-
setMediaTypeToContent(schema, content, value);
117+
Content content = requestBody.getContent();
118+
119+
if (AbstractOpenApiResource.methodOverloaded && content != null) {
120+
for (String value : allConsumes) {
121+
setMediaTypeToContent(schema, content, value);
122+
}
123+
} else {
124+
content = new Content();
125+
for (String value : allConsumes) {
126+
setMediaTypeToContent(schema, content, value);
127+
}
117128
}
118129
requestBody.setContent(content);
119130
}
@@ -124,6 +135,7 @@ private RequestBody buildRequestBody(RequestBody requestBody, Components compone
124135
requestBody.setDescription(parameterDoc.description());
125136
requestBody.setRequired(parameterDoc.required());
126137
}
138+
127139
return requestBody;
128140
}
129141

0 commit comments

Comments
 (0)