Skip to content

Commit f7bad8f

Browse files
authored
fix: include extended interfaces in springdoc parameters (#284)
1 parent c4754a4 commit f7bad8f

2 files changed

Lines changed: 50 additions & 6 deletions

File tree

src/main/java/net/kaczmarzyk/spring/data/jpa/swagger/springdoc/SpecificationArgResolverSpringdocOperationCustomizer.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,25 @@ private List<String> extractRequiredParametersFromHandlerMethod(HandlerMethod ha
112112
}
113113

114114
private List<Annotation> extractAnnotationsFromMethodParameter(MethodParameter methodParameter) {
115-
116115
List<Annotation> annotations = new ArrayList<>(
117116
asList(methodParameter.getParameterAnnotations()));
118117

119-
if (methodParameter.getParameterType() != Specification.class) {
120-
List<Annotation> innerParameterAnnotations = asList(methodParameter.getParameterType().getAnnotations());
121-
annotations.addAll(innerParameterAnnotations);
122-
}
118+
extractAnnotationsRecursive(annotations, methodParameter.getParameterType());
123119

124120
return annotations;
125121
}
126122

123+
private void extractAnnotationsRecursive(List<Annotation> buffer, Class<?> clazz) {
124+
if (clazz != Specification.class) {
125+
List<Annotation> innerParameterAnnotations = asList(clazz.getAnnotations());
126+
buffer.addAll(innerParameterAnnotations);
127+
128+
for (Class<?> extendedInterface : clazz.getInterfaces()) {
129+
extractAnnotationsRecursive(buffer, extendedInterface);
130+
}
131+
}
132+
}
133+
127134
private List<Parameter> createParametersFromSpecs(List<Spec> specs, List<String> requiredParams, List<String> requiredHeaders) {
128135
List<Parameter> parameters = specs.stream()
129136
.map(spec -> {

src/test/java/net/kaczmarzyk/spring/data/jpa/swagger/springdoc/SpecificationArgResolverSpringdocOperationCustomizerTest.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,31 @@ public void shouldCorrectlyReadParametersFromCustomFilterWithAnnotations() throw
281281
.withQueryParameterName("annotatedFilterSecondParam");
282282
}
283283

284+
@Test
285+
public void shouldCorrectlyReadParametersFromExtendedCustomFilterWithAnnotations() throws NoSuchMethodException {
286+
// given
287+
HandlerMethod handlerMethod = handlerMethodForControllerMethodAndParameterType("customExtendedFilterWithAnnotationsTestMethod", ExtendedTestFilterWithAnnotations.class);
288+
Operation operation = new Operation();
289+
290+
// when
291+
Operation customizedOperation = springdocOperationCustomizer.customize(operation, handlerMethod);
292+
293+
// then
294+
assertThatOperation(customizedOperation)
295+
.hasParametersCount(4)
296+
.containsParameterAtIndex(0)
297+
.withQueryParameterName("annotatedFilterThirdParam")
298+
.and()
299+
.containsParameterAtIndex(1)
300+
.withQueryParameterName("annotatedFilterFourthParam")
301+
.and()
302+
.containsParameterAtIndex(2)
303+
.withQueryParameterName("annotatedFilterFirstParam")
304+
.and()
305+
.containsParameterAtIndex(3)
306+
.withQueryParameterName("annotatedFilterSecondParam");
307+
}
308+
284309
@Test
285310
public void shouldCorrectlyReadParametersFromCustomFilterWithoutAnnotations() throws NoSuchMethodException {
286311
// given
@@ -489,6 +514,11 @@ public void customFilterWithAnnotationsTestMethod(TestFilterWithAnnotations filt
489514

490515
}
491516

517+
@RequestMapping(value = "/custom-extended-filter-with-annotations")
518+
public void customExtendedFilterWithAnnotationsTestMethod(ExtendedTestFilterWithAnnotations filter) {
519+
520+
}
521+
492522
@RequestMapping(value = "/custom-filter-without-annotations")
493523
public void customFilterWithoutAnnotationsTestMethod(
494524
@Or({
@@ -560,8 +590,15 @@ private interface TestFilterWithAnnotations extends Specification<Object> {
560590

561591
}
562592

563-
private interface TestFilterWithoutAnnotations extends Specification<Object> {
593+
@Or({
594+
@Spec(path = "", params = "annotatedFilterThirdParam", spec = Like.class),
595+
@Spec(path = "", params = "annotatedFilterFourthParam", spec = Like.class),
596+
})
597+
private interface ExtendedTestFilterWithAnnotations extends TestFilterWithAnnotations {
564598

565599
}
566600

601+
private interface TestFilterWithoutAnnotations extends Specification<Object> {
602+
603+
}
567604
}

0 commit comments

Comments
 (0)