Skip to content

Commit f2e74af

Browse files
authored
Merge pull request #2 from springdoc/master
updated codebase from origin
2 parents ebd90ec + 4075481 commit f2e74af

File tree

47 files changed

+1954
-193
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1954
-193
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,16 @@
7373
<webjars-locator.version>0.38</webjars-locator.version>
7474
<spring-security-oauth2.version>2.3.8.RELEASE</spring-security-oauth2.version>
7575
<classgraph.version>4.8.44</classgraph.version>
76+
<javassist.version>3.26.0-GA</javassist.version>
7677
</properties>
7778

7879
<dependencyManagement>
7980
<dependencies>
81+
<dependency>
82+
<groupId>org.javassist</groupId>
83+
<artifactId>javassist</artifactId>
84+
<version>${javassist.version}</version>
85+
</dependency>
8086
<!-- swagger dependencies -->
8187
<dependency>
8288
<groupId>io.swagger.core.v3</groupId>

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

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,15 @@
4949
import io.swagger.v3.oas.models.media.Content;
5050
import io.swagger.v3.oas.models.media.MediaType;
5151
import io.swagger.v3.oas.models.media.Schema;
52+
import io.swagger.v3.oas.models.media.StringSchema;
5253
import io.swagger.v3.oas.models.parameters.Parameter;
5354
import io.swagger.v3.oas.models.parameters.RequestBody;
5455
import org.apache.commons.lang3.StringUtils;
5556
import org.springdoc.core.customizers.OperationCustomizer;
5657
import org.springdoc.core.customizers.ParameterCustomizer;
5758

5859
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
60+
import org.springframework.core.MethodParameter;
5961
import org.springframework.core.annotation.AnnotatedElementUtils;
6062
import org.springframework.core.annotation.AnnotationUtils;
6163
import org.springframework.http.HttpMethod;
@@ -84,7 +86,7 @@ public abstract class AbstractRequestBuilder {
8486
private static final List<Class> PARAM_TYPES_TO_IGNORE = new ArrayList<>();
8587

8688
// using string litterals to support both validation-api v1 and v2
87-
private static final String[] ANNOTATIONS_FOR_REQUIRED = { NotNull.class.getName(), org.springframework.web.bind.annotation.RequestBody.class.getName(),"javax.validation.constraints.NotBlank", "javax.validation.constraints.NotEmpty" };
89+
private static final String[] ANNOTATIONS_FOR_REQUIRED = { NotNull.class.getName(), org.springframework.web.bind.annotation.RequestBody.class.getName(), "javax.validation.constraints.NotBlank", "javax.validation.constraints.NotEmpty" };
8890

8991
private static final String POSITIVE_OR_ZERO = "javax.validation.constraints.PositiveOrZero";
9092

@@ -139,13 +141,12 @@ public Operation build(Components components, HandlerMethod handlerMethod, Reque
139141
// Documentation
140142
String operationId = operationBuilder.getOperationId(handlerMethod.getMethod().getName(),
141143
operation.getOperationId(), openAPI);
142-
143144
operation.setOperationId(operationId);
144145
// requests
145146
LocalVariableTableParameterNameDiscoverer d = parameterBuilder.getLocalSpringDocParameterNameDiscoverer();
146147
String[] pNames = d.getParameterNames(handlerMethod.getMethod());
147-
java.lang.reflect.Parameter[] parameters = handlerMethod.getMethod().getParameters();
148-
String[] reflectionParametersNames = Arrays.stream(parameters).map(java.lang.reflect.Parameter::getName).toArray(String[]::new);
148+
MethodParameter[] parameters = handlerMethod.getMethodParameters();
149+
String[] reflectionParametersNames = Arrays.stream(parameters).map(MethodParameter::getParameterName).toArray(String[]::new);
149150
if (pNames == null) {
150151
pNames = reflectionParametersNames;
151152
}
@@ -158,8 +159,7 @@ public Operation build(Components components, HandlerMethod handlerMethod, Reque
158159
// check if query param
159160
Parameter parameter = null;
160161
final String pName = pNames[i] == null ? reflectionParametersNames[i] : pNames[i];
161-
io.swagger.v3.oas.annotations.Parameter parameterDoc = parameterBuilder.getParameterAnnotation(
162-
handlerMethod, parameters[i], i, io.swagger.v3.oas.annotations.Parameter.class);
162+
io.swagger.v3.oas.annotations.Parameter parameterDoc = parameters[i].getParameterAnnotation(io.swagger.v3.oas.annotations.Parameter.class);
163163
if (parameterDoc == null) {
164164
parameterDoc = parametersDocMap.get(pName);
165165
}
@@ -172,21 +172,21 @@ public Operation build(Components components, HandlerMethod handlerMethod, Reque
172172
methodAttributes.getJsonViewAnnotation());
173173
}
174174

175-
if (!isParamToIgnore(parameters[i])) {
175+
if (!isParamToIgnore(parameters[i].getParameter())) {
176176
ParameterInfo parameterInfo = new ParameterInfo(pName, parameters[i], parameter, i);
177-
parameter = buildParams(parameterInfo, components, handlerMethod, requestMethod,
177+
parameter = buildParams(parameterInfo, components, requestMethod,
178178
methodAttributes.getJsonViewAnnotation());
179179
// Merge with the operation parameters
180180
parameter = parameterBuilder.mergeParameter(operationParameters, parameter);
181181
if (isValidParameter(parameter)) {
182-
applyBeanValidatorAnnotations(parameter, Arrays.asList(parameters[i].getAnnotations()));
182+
applyBeanValidatorAnnotations(parameter, Arrays.asList(parameters[i].getParameterAnnotations()));
183183
}
184184
else if (!RequestMethod.GET.equals(requestMethod)) {
185185
if (operation.getRequestBody() != null)
186186
requestBodyInfo.setRequestBody(operation.getRequestBody());
187-
requestBodyBuilder.calculateRequestBodyInfo(components, handlerMethod, methodAttributes, i,
187+
requestBodyBuilder.calculateRequestBodyInfo(components, methodAttributes,
188188
parameterInfo, requestBodyInfo);
189-
applyBeanValidatorAnnotations(requestBodyInfo.getRequestBody(), Arrays.asList(parameters[i].getAnnotations()));
189+
applyBeanValidatorAnnotations(requestBodyInfo.getRequestBody(), Arrays.asList(parameters[i].getParameterAnnotations()));
190190
}
191191
customiseParameter(parameter, parameterInfo, handlerMethod);
192192
}
@@ -220,6 +220,16 @@ private LinkedHashMap<String, Parameter> getParameterLinkedHashMap(Components co
220220
map.put(entry.getKey(), parameter);
221221
}
222222
}
223+
224+
for (Map.Entry<String, String> entry : methodAttributes.getHeaders().entrySet()) {
225+
Parameter parameter = new Parameter().in(ParameterIn.HEADER.toString()).name(entry.getKey()).schema(new StringSchema().addEnumItem(entry.getValue()));
226+
if (map.containsKey(entry.getKey())) {
227+
parameter = map.get(entry.getKey());
228+
parameter.getSchema().addEnumItemObject(entry.getValue());
229+
parameter.setSchema(parameter.getSchema());
230+
}
231+
map.put(entry.getKey(), parameter);
232+
}
223233
return map;
224234
}
225235

@@ -252,19 +262,14 @@ private boolean isValidParameter(Parameter parameter) {
252262
return parameter != null && (parameter.getName() != null || parameter.get$ref() != null);
253263
}
254264

255-
private Parameter buildParams(ParameterInfo parameterInfo, Components components, HandlerMethod handlerMethod,
265+
private Parameter buildParams(ParameterInfo parameterInfo, Components components,
256266
RequestMethod requestMethod, JsonView jsonView) {
257-
java.lang.reflect.Parameter parameters = parameterInfo.getParameter();
258-
int index = parameterInfo.getIndex();
259-
260-
RequestHeader requestHeader = parameterBuilder.getParameterAnnotation(handlerMethod, parameters, index,
261-
RequestHeader.class);
262-
RequestParam requestParam = parameterBuilder.getParameterAnnotation(handlerMethod, parameters, index,
263-
RequestParam.class);
264-
PathVariable pathVar = parameterBuilder.getParameterAnnotation(handlerMethod, parameters, index,
265-
PathVariable.class);
266-
CookieValue cookieValue = parameterBuilder.getParameterAnnotation(handlerMethod, parameters, index,
267-
CookieValue.class);
267+
MethodParameter methodParameter = parameterInfo.getMethodParameter();
268+
269+
RequestHeader requestHeader = methodParameter.getParameterAnnotation(RequestHeader.class);
270+
RequestParam requestParam = methodParameter.getParameterAnnotation(RequestParam.class);
271+
PathVariable pathVar = methodParameter.getParameterAnnotation(PathVariable.class);
272+
CookieValue cookieValue = methodParameter.getParameterAnnotation(CookieValue.class);
268273

269274
Parameter parameter = null;
270275
RequestInfo requestInfo;
@@ -276,7 +281,7 @@ private Parameter buildParams(ParameterInfo parameterInfo, Components components
276281

277282
}
278283
else if (requestParam != null && !parameterBuilder.isFile(parameterInfo.getParameter())) {
279-
boolean isOptional = Optional.class.equals(parameters.getType());
284+
boolean isOptional = Optional.class.equals(methodParameter.getParameterType());
280285
requestInfo = new RequestInfo(ParameterIn.QUERY.toString(), requestParam.value(), requestParam.required() && !isOptional,
281286
requestParam.defaultValue());
282287
parameter = buildParam(parameterInfo, components, requestInfo, jsonView);

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

Lines changed: 13 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
package org.springdoc.core;
2020

2121
import java.io.IOException;
22-
import java.lang.annotation.Annotation;
23-
import java.lang.reflect.Method;
2422
import java.lang.reflect.ParameterizedType;
2523
import java.lang.reflect.Type;
2624
import java.lang.reflect.WildcardType;
@@ -30,7 +28,6 @@
3028
import java.util.List;
3129
import java.util.Map;
3230
import java.util.Optional;
33-
import java.util.Set;
3431

3532
import com.fasterxml.jackson.annotation.JsonView;
3633
import com.fasterxml.jackson.databind.JavaType;
@@ -46,31 +43,31 @@
4643
import io.swagger.v3.oas.models.media.ObjectSchema;
4744
import io.swagger.v3.oas.models.media.Schema;
4845
import io.swagger.v3.oas.models.parameters.Parameter;
49-
import org.apache.commons.lang3.ClassUtils;
5046
import org.apache.commons.lang3.StringUtils;
51-
import org.apache.commons.lang3.reflect.MethodUtils;
5247

5348
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
54-
import org.springframework.core.annotation.AnnotationUtils;
49+
import org.springframework.core.MethodParameter;
5550
import org.springframework.http.codec.multipart.FilePart;
56-
import org.springframework.web.method.HandlerMethod;
5751
import org.springframework.web.multipart.MultipartFile;
5852

5953
@SuppressWarnings("rawtypes")
6054
public class GenericParameterBuilder {
6155

6256
private final LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer;
57+
6358
private final IgnoredParameterAnnotations ignoredParameterAnnotations;
59+
6460
private final PropertyResolverUtils propertyResolverUtils;
61+
6562
private static final List<Class<?>> FILE_TYPES = new ArrayList<>();
6663

6764
static {
6865
FILE_TYPES.add(MultipartFile.class);
6966
}
7067

7168
public GenericParameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
72-
IgnoredParameterAnnotations ignoredParameterAnnotations,
73-
PropertyResolverUtils propertyResolverUtils) {
69+
IgnoredParameterAnnotations ignoredParameterAnnotations,
70+
PropertyResolverUtils propertyResolverUtils) {
7471
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
7572
this.ignoredParameterAnnotations = ignoredParameterAnnotations;
7673
this.propertyResolverUtils = propertyResolverUtils;
@@ -200,31 +197,25 @@ else if (AnnotationsUtils.hasArrayAnnotation(parameterDoc.content()[0].array()))
200197
Schema calculateSchema(Components components, ParameterInfo parameterInfo,
201198
RequestBodyInfo requestBodyInfo, JsonView jsonView) {
202199
Schema schemaN;
203-
Class<?> schemaImplementation = null;
204-
Type returnType = null;
205-
JavaType ct = null;
206200
String paramName = parameterInfo.getpName();
207-
java.lang.reflect.Parameter parameter = parameterInfo.getParameter();
208-
if (parameter != null) {
209-
returnType = parameter.getParameterizedType();
210-
ct = constructType(parameter.getType());
211-
schemaImplementation = parameter.getType();
212-
}
201+
MethodParameter methodParameter = parameterInfo.getMethodParameter();
202+
JavaType ct = constructType(methodParameter.getParameterType());
213203

214204
if (parameterInfo.getParameterModel() == null || parameterInfo.getParameterModel().getSchema() == null) {
215205
if (isFile(ct)) {
216206
schemaN = getFileSchema(requestBodyInfo);
217207
schemaN.addProperties(paramName, new FileSchema());
218208
return schemaN;
219-
} else if (returnType instanceof ParameterizedType) {
220-
ParameterizedType parameterizedType = (ParameterizedType) returnType;
209+
}
210+
else if (methodParameter.getGenericParameterType() instanceof ParameterizedType) {
211+
ParameterizedType parameterizedType = (ParameterizedType) methodParameter.getGenericParameterType();
221212
if (isFile(parameterizedType)) {
222213
return extractFileSchema(paramName, requestBodyInfo);
223214
}
224-
schemaN = calculateSchemaFromParameterizedType(components, returnType, jsonView);
215+
schemaN = SpringDocAnnotationsUtils.extractSchema(components, methodParameter.getGenericParameterType(), jsonView);
225216
}
226217
else {
227-
schemaN = SpringDocAnnotationsUtils.resolveSchemaFromType(schemaImplementation, components, jsonView);
218+
schemaN = SpringDocAnnotationsUtils.resolveSchemaFromType(methodParameter.getParameterType(), components, jsonView, methodParameter.getParameterAnnotations());
228219
}
229220
}
230221
else {
@@ -247,10 +238,6 @@ public LocalVariableTableParameterNameDiscoverer getLocalSpringDocParameterNameD
247238
return localSpringDocParameterNameDiscoverer;
248239
}
249240

250-
private Schema calculateSchemaFromParameterizedType(Components components, Type paramType, JsonView jsonView) {
251-
return SpringDocAnnotationsUtils.extractSchema(components, paramType, jsonView);
252-
}
253-
254241
private Schema extractFileSchema(String paramName, RequestBodyInfo requestBodyInfo) {
255242
Schema schemaN = getFileSchema(requestBodyInfo);
256243
ArraySchema schemaFile = new ArraySchema();
@@ -304,21 +291,6 @@ else if (type instanceof ParameterizedType) {
304291
return result;
305292
}
306293

307-
<A extends Annotation> A getParameterAnnotation(HandlerMethod handlerMethod,
308-
java.lang.reflect.Parameter parameter, int i, Class<A> annotationType) {
309-
A parameterDoc = AnnotationUtils.getAnnotation(parameter, annotationType);
310-
if (parameterDoc == null) {
311-
Set<Method> methods = MethodUtils.getOverrideHierarchy(handlerMethod.getMethod(),
312-
ClassUtils.Interfaces.INCLUDE);
313-
for (Method methodOverriden : methods) {
314-
parameterDoc = AnnotationUtils.getAnnotation(methodOverriden.getParameters()[i], annotationType);
315-
if (parameterDoc != null)
316-
break;
317-
}
318-
}
319-
return parameterDoc;
320-
}
321-
322294
private void setExamples(io.swagger.v3.oas.annotations.Parameter parameterDoc, Parameter parameter) {
323295
Map<String, Example> exampleMap = new HashMap<>();
324296
if (parameterDoc.examples().length == 1 && StringUtils.isBlank(parameterDoc.examples()[0].name())) {

0 commit comments

Comments
 (0)