Skip to content

Commit c56751e

Browse files
author
bnasslahsen
committed
replacement of ReflectionUtils by spring AnnotatedElementUtils
1 parent 8a54c60 commit c56751e

File tree

5 files changed

+28
-33
lines changed

5 files changed

+28
-33
lines changed

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

+7-7
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.springdoc.core.SpringDocConfigProperties.GroupConfig;
5858
import org.springdoc.core.customizers.OpenApiCustomiser;
5959

60+
import org.springframework.core.annotation.AnnotatedElementUtils;
6061
import org.springframework.core.annotation.AnnotationUtils;
6162
import org.springframework.util.AntPathMatcher;
6263
import org.springframework.util.CollectionUtils;
@@ -170,7 +171,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
170171
continue;
171172
}
172173

173-
RequestMapping reqMappingClass = ReflectionUtils.getAnnotation(handlerMethod.getBeanType(),
174+
RequestMapping reqMappingClass = AnnotatedElementUtils.findMergedAnnotation(handlerMethod.getBeanType(),
174175
RequestMapping.class);
175176

176177
MethodAttributes methodAttributes = new MethodAttributes(springDocConfigProperties.getDefaultConsumesMediaType(), springDocConfigProperties.getDefaultProducesMediaType());
@@ -190,7 +191,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
190191
}
191192

192193
// Add documentation from operation annotation
193-
io.swagger.v3.oas.annotations.Operation apiOperation = ReflectionUtils.getAnnotation(method,
194+
io.swagger.v3.oas.annotations.Operation apiOperation = AnnotatedElementUtils.findMergedAnnotation(method,
194195
io.swagger.v3.oas.annotations.Operation.class);
195196

196197
calculateJsonView(apiOperation, methodAttributes, method);
@@ -202,7 +203,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
202203
// compute tags
203204
operation = openAPIBuilder.buildTags(handlerMethod, operation, openAPI);
204205

205-
io.swagger.v3.oas.annotations.parameters.RequestBody requestBodyDoc = ReflectionUtils.getAnnotation(method,
206+
io.swagger.v3.oas.annotations.parameters.RequestBody requestBodyDoc = AnnotatedElementUtils.findMergedAnnotation(method,
206207
io.swagger.v3.oas.annotations.parameters.RequestBody.class);
207208

208209
// RequestBody in Operation
@@ -218,8 +219,7 @@ protected void calculatePath(HandlerMethod handlerMethod, String operationPath,
218219
ApiResponses apiResponses = responseBuilder.build(components, handlerMethod, operation, methodAttributes);
219220
operation.setResponses(apiResponses);
220221

221-
List<io.swagger.v3.oas.annotations.callbacks.Callback> apiCallbacks = ReflectionUtils
222-
.getRepeatableAnnotations(method, io.swagger.v3.oas.annotations.callbacks.Callback.class);
222+
Set<io.swagger.v3.oas.annotations.callbacks.Callback> apiCallbacks = AnnotatedElementUtils.findMergedRepeatableAnnotations(method, io.swagger.v3.oas.annotations.callbacks.Callback.class);
223223

224224
// callbacks
225225
if (!CollectionUtils.isEmpty(apiCallbacks)) {
@@ -241,7 +241,7 @@ private void calculateJsonView(io.swagger.v3.oas.annotations.Operation apiOperat
241241
jsonViewAnnotationForRequestBody = null;
242242
}
243243
else {
244-
jsonViewAnnotation = ReflectionUtils.getAnnotation(method, JsonView.class);
244+
jsonViewAnnotation = AnnotatedElementUtils.findMergedAnnotation(method, JsonView.class);
245245
/*
246246
* If one and only one exists, use the @JsonView annotation from the method
247247
* parameter annotated with @RequestBody. Otherwise fall back to the @JsonView
@@ -408,6 +408,6 @@ public static void addDeprecatedType(Class<?> cls) {
408408
}
409409

410410
private boolean isDeprecatedType(Method method) {
411-
return DEPRECATED_TYPES.stream().anyMatch(clazz -> (ReflectionUtils.getAnnotation(method, clazz) != null));
411+
return DEPRECATED_TYPES.stream().anyMatch(clazz -> (AnnotatedElementUtils.findMergedAnnotation(method, clazz) != null));
412412
}
413413
}

Diff for: springdoc-openapi-common/src/main/java/org/springdoc/core/GenericResponseBuilder.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333

3434
import com.fasterxml.jackson.annotation.JsonView;
3535
import io.swagger.v3.core.util.AnnotationsUtils;
36-
import io.swagger.v3.core.util.ReflectionUtils;
3736
import io.swagger.v3.oas.models.Components;
3837
import io.swagger.v3.oas.models.Operation;
3938
import io.swagger.v3.oas.models.media.ComposedSchema;
@@ -93,7 +92,7 @@ public void buildGenericResponse(Components components, Map<String, Object> find
9392
// for each one build ApiResponse and add it to existing responses
9493
for (Method method : methods) {
9594
if (!operationBuilder.isHidden(method)) {
96-
RequestMapping reqMappringMethod = ReflectionUtils.getAnnotation(method, RequestMapping.class);
95+
RequestMapping reqMappringMethod = AnnotatedElementUtils.findMergedAnnotation(method, RequestMapping.class);
9796
String[] methodProduces = { springDocConfigProperties.getDefaultProducesMediaType() };
9897
if (reqMappringMethod != null) {
9998
methodProduces = reqMappringMethod.produces();

Diff for: springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIBuilder.java

+11-12
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import java.util.stream.Stream;
3434

3535
import io.swagger.v3.core.util.AnnotationsUtils;
36-
import io.swagger.v3.core.util.ReflectionUtils;
3736
import io.swagger.v3.oas.annotations.Hidden;
3837
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
3938
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -54,6 +53,7 @@
5453
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
5554
import org.springframework.context.ApplicationContext;
5655
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
56+
import org.springframework.core.annotation.AnnotatedElementUtils;
5757
import org.springframework.core.annotation.AnnotationUtils;
5858
import org.springframework.core.type.filter.AnnotationTypeFilter;
5959
import org.springframework.stereotype.Controller;
@@ -167,12 +167,12 @@ public boolean isServersPresent() {
167167

168168
public Operation buildTags(HandlerMethod handlerMethod, Operation operation, OpenAPI openAPI) {
169169
// class tags
170-
List<Tag> classTags =
171-
ReflectionUtils.getRepeatableAnnotations(handlerMethod.getBeanType(), Tag.class);
170+
Set<Tag> classTags =
171+
AnnotatedElementUtils.findAllMergedAnnotations(handlerMethod.getBeanType(), Tag.class);
172172

173173
// method tags
174-
List<Tag> methodTags =
175-
ReflectionUtils.getRepeatableAnnotations(handlerMethod.getMethod(), Tag.class);
174+
Set<Tag> methodTags =
175+
AnnotatedElementUtils.findAllMergedAnnotations(handlerMethod.getMethod(), Tag.class);
176176

177177
List<Tag> allTags = new ArrayList<>();
178178
Set<String> tagsStr = new HashSet<>();
@@ -244,7 +244,7 @@ private Optional<OpenAPIDefinition> getOpenAPIDefinition() {
244244
if (openAPIDefinitionMap.size() > 0) {
245245
Map.Entry<String, Object> entry = openAPIDefinitionMap.entrySet().iterator().next();
246246
Class<?> objClz = entry.getValue().getClass();
247-
apiDef = ReflectionUtils.getAnnotation(objClz, OpenAPIDefinition.class);
247+
apiDef = AnnotatedElementUtils.findMergedAnnotation(objClz, OpenAPIDefinition.class);
248248
}
249249

250250
// Look for OpenAPIDefinition in the spring classpath
@@ -319,8 +319,7 @@ private void calculateSecuritySchemes(Components components) {
319319
if (securitySchemeBeans.size() > 0) {
320320
for (Map.Entry<String, Object> entry : securitySchemeBeans.entrySet()) {
321321
Class<?> objClz = entry.getValue().getClass();
322-
List<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = ReflectionUtils
323-
.getRepeatableAnnotations(objClz, io.swagger.v3.oas.annotations.security.SecurityScheme.class);
322+
Set<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = AnnotatedElementUtils.findMergedRepeatableAnnotations(objClz, io.swagger.v3.oas.annotations.security.SecurityScheme.class);
324323
this.addSecurityScheme(apiSecurityScheme, components);
325324
}
326325
}
@@ -333,15 +332,15 @@ private void calculateSecuritySchemes(Components components) {
333332
new AnnotationTypeFilter(io.swagger.v3.oas.annotations.security.SecurityScheme.class));
334333
if (AutoConfigurationPackages.has(context)) {
335334
List<String> packagesToScan = AutoConfigurationPackages.get(context);
336-
List<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = getSecuritySchemesClasses(
335+
Set<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = getSecuritySchemesClasses(
337336
scanner, packagesToScan);
338337
this.addSecurityScheme(apiSecurityScheme, components);
339338
}
340339

341340
}
342341
}
343342

344-
private void addSecurityScheme(List<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme,
343+
private void addSecurityScheme(Set<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme,
345344
Components components) {
346345
for (io.swagger.v3.oas.annotations.security.SecurityScheme securitySchemeAnnotation : apiSecurityScheme) {
347346
Optional<SecuritySchemePair> securityScheme = securityParser.getSecurityScheme(securitySchemeAnnotation);
@@ -377,9 +376,9 @@ private OpenAPIDefinition getApiDefClass(ClassPathScanningCandidateComponentProv
377376
return null;
378377
}
379378

380-
private List<io.swagger.v3.oas.annotations.security.SecurityScheme> getSecuritySchemesClasses(
379+
private Set<io.swagger.v3.oas.annotations.security.SecurityScheme> getSecuritySchemesClasses(
381380
ClassPathScanningCandidateComponentProvider scanner, List<String> packagesToScan) {
382-
List<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = new ArrayList<>();
381+
Set<io.swagger.v3.oas.annotations.security.SecurityScheme> apiSecurityScheme = new HashSet<>();
383382
for (String pack : packagesToScan) {
384383
for (BeanDefinition bd : scanner.findCandidateComponents(pack)) {
385384
try {

Diff for: springdoc-openapi-common/src/main/java/org/springdoc/core/OperationBuilder.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ public boolean isHidden(Method method) {
132132
}
133133

134134
public Optional<Map<String, Callback>> buildCallbacks(
135-
List<io.swagger.v3.oas.annotations.callbacks.Callback> apiCallbacks, Components components, OpenAPI openAPI,
135+
Set<io.swagger.v3.oas.annotations.callbacks.Callback> apiCallbacks, Components components, OpenAPI openAPI,
136136
MethodAttributes methodAttributes) {
137137
Map<String, Callback> callbacks = new LinkedHashMap<>();
138138

Diff for: springdoc-openapi-common/src/main/java/org/springdoc/core/SecurityParser.java

+8-11
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import java.util.Set;
2828

2929
import io.swagger.v3.core.util.AnnotationsUtils;
30-
import io.swagger.v3.core.util.ReflectionUtils;
3130
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
3231
import io.swagger.v3.oas.annotations.security.OAuthScope;
3332
import io.swagger.v3.oas.models.Operation;
@@ -38,6 +37,7 @@
3837
import io.swagger.v3.oas.models.security.SecurityScheme;
3938
import org.apache.commons.lang3.StringUtils;
4039

40+
import org.springframework.core.annotation.AnnotatedElementUtils;
4141
import org.springframework.util.CollectionUtils;
4242
import org.springframework.web.method.HandlerMethod;
4343

@@ -84,29 +84,26 @@ private static boolean isEmpty(OAuthScope[] scopes) {
8484
public io.swagger.v3.oas.annotations.security.SecurityRequirement[] getSecurityRequirements(
8585
HandlerMethod method) {
8686
// class SecurityRequirements
87-
io.swagger.v3.oas.annotations.security.SecurityRequirements classSecurity = ReflectionUtils
88-
.getAnnotation(method.getBeanType(), io.swagger.v3.oas.annotations.security.SecurityRequirements.class);
87+
io.swagger.v3.oas.annotations.security.SecurityRequirements classSecurity = AnnotatedElementUtils.findMergedAnnotation(method.getBeanType(), io.swagger.v3.oas.annotations.security.SecurityRequirements.class);
8988
// method SecurityRequirements
90-
io.swagger.v3.oas.annotations.security.SecurityRequirements methodSecurity = ReflectionUtils
91-
.getAnnotation(method.getMethod(), io.swagger.v3.oas.annotations.security.SecurityRequirements.class);
89+
io.swagger.v3.oas.annotations.security.SecurityRequirements methodSecurity = AnnotatedElementUtils.findMergedAnnotation(method.getMethod(), io.swagger.v3.oas.annotations.security.SecurityRequirements.class);
9290

9391
Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> allSecurityTags = null;
9492

9593
if (classSecurity != null) {
9694
allSecurityTags = new HashSet<>(Arrays.asList(classSecurity.value()));
9795
}
9896
if (methodSecurity != null) {
99-
allSecurityTags = addSecurityRequirements(allSecurityTags, Arrays.asList(methodSecurity.value()));
97+
allSecurityTags = addSecurityRequirements(allSecurityTags, new HashSet<>(Arrays.asList(methodSecurity.value())));
10098
}
10199

102100
if (CollectionUtils.isEmpty(allSecurityTags)) {
103101
// class SecurityRequirement
104-
List<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsClassList = ReflectionUtils
105-
.getRepeatableAnnotations(method.getBeanType(),
102+
Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsClassList = AnnotatedElementUtils.findMergedRepeatableAnnotations(
103+
method.getBeanType(),
106104
io.swagger.v3.oas.annotations.security.SecurityRequirement.class);
107105
// method SecurityRequirement
108-
List<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsMethodList = ReflectionUtils
109-
.getRepeatableAnnotations(method.getMethod(),
106+
Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsMethodList = AnnotatedElementUtils.findMergedRepeatableAnnotations(method.getMethod(),
110107
io.swagger.v3.oas.annotations.security.SecurityRequirement.class);
111108
if (!CollectionUtils.isEmpty(securityRequirementsClassList)) {
112109
allSecurityTags = addSecurityRequirements(allSecurityTags, securityRequirementsClassList);
@@ -119,7 +116,7 @@ public io.swagger.v3.oas.annotations.security.SecurityRequirement[] getSecurityR
119116
return (allSecurityTags != null) ? allSecurityTags.toArray(new io.swagger.v3.oas.annotations.security.SecurityRequirement[0]) : null;
120117
}
121118

122-
private Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> addSecurityRequirements(Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> allSecurityTags, List<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsClassList) {
119+
private Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> addSecurityRequirements(Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> allSecurityTags, Set<io.swagger.v3.oas.annotations.security.SecurityRequirement> securityRequirementsClassList) {
123120
if (allSecurityTags == null)
124121
allSecurityTags = new HashSet<>();
125122
allSecurityTags.addAll(securityRequirementsClassList);

0 commit comments

Comments
 (0)