Skip to content

Commit 841a690

Browse files
author
bnasslahsen
committed
Added support to ignore annotations on parameter level
1 parent 4075481 commit 841a690

File tree

10 files changed

+114
-57
lines changed

10 files changed

+114
-57
lines changed

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import javax.validation.constraints.Size;
4242

4343
import com.fasterxml.jackson.annotation.JsonView;
44-
import io.swagger.v3.oas.annotations.Hidden;
4544
import io.swagger.v3.oas.annotations.enums.ParameterIn;
4645
import io.swagger.v3.oas.models.Components;
4746
import io.swagger.v3.oas.models.OpenAPI;
@@ -59,7 +58,6 @@
5958
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
6059
import org.springframework.core.MethodParameter;
6160
import org.springframework.core.annotation.AnnotatedElementUtils;
62-
import org.springframework.core.annotation.AnnotationUtils;
6361
import org.springframework.http.HttpMethod;
6462
import org.springframework.util.CollectionUtils;
6563
import org.springframework.validation.BindingResult;
@@ -172,7 +170,7 @@ public Operation build(Components components, HandlerMethod handlerMethod, Reque
172170
methodAttributes.getJsonViewAnnotation());
173171
}
174172

175-
if (!isParamToIgnore(parameters[i].getParameter())) {
173+
if (!isParamToIgnore(parameters[i])) {
176174
ParameterInfo parameterInfo = new ParameterInfo(pName, parameters[i], parameter, i);
177175
parameter = buildParams(parameterInfo, components, requestMethod,
178176
methodAttributes.getJsonViewAnnotation());
@@ -243,11 +241,11 @@ protected Parameter customiseParameter(Parameter parameter, ParameterInfo parame
243241
return parameter;
244242
}
245243

246-
protected boolean isParamToIgnore(java.lang.reflect.Parameter parameter) {
247-
if (parameter.isAnnotationPresent(PathVariable.class) || parameter.isAnnotationPresent(RequestParam.class)) {
244+
protected boolean isParamToIgnore(MethodParameter parameter) {
245+
if (parameter.getParameterAnnotation(PathVariable.class) !=null || parameter.getParameterAnnotation(RequestParam.class) !=null) {
248246
return false;
249247
}
250-
return parameterBuilder.isAnnotationToIgnore(parameter) || PARAM_TYPES_TO_IGNORE.contains(parameter.getType()) || (AnnotationUtils.findAnnotation(parameter.getType(), Hidden.class) != null);
248+
return parameterBuilder.isAnnotationToIgnore(parameter) || PARAM_TYPES_TO_IGNORE.contains(parameter.getParameterType());
251249
}
252250

253251
private void setParams(Operation operation, List<Parameter> operationParameters, RequestBodyInfo requestBodyInfo) {

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.fasterxml.jackson.databind.type.TypeFactory;
3535
import io.swagger.v3.core.util.AnnotationsUtils;
3636
import io.swagger.v3.core.util.Json;
37+
import io.swagger.v3.oas.annotations.Hidden;
3738
import io.swagger.v3.oas.annotations.enums.Explode;
3839
import io.swagger.v3.oas.annotations.media.ExampleObject;
3940
import io.swagger.v3.oas.models.Components;
@@ -47,6 +48,7 @@
4748

4849
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
4950
import org.springframework.core.MethodParameter;
51+
import org.springframework.core.annotation.AnnotationUtils;
5052
import org.springframework.http.codec.multipart.FilePart;
5153
import org.springframework.web.multipart.MultipartFile;
5254

@@ -55,21 +57,19 @@ public class GenericParameterBuilder {
5557

5658
private final LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer;
5759

58-
private final IgnoredParameterAnnotations ignoredParameterAnnotations;
59-
6060
private final PropertyResolverUtils propertyResolverUtils;
6161

6262
private static final List<Class<?>> FILE_TYPES = new ArrayList<>();
63+
private static final List<Class> ANNOTATIOSN_TO_IGNORE = new ArrayList<>();
6364

6465
static {
6566
FILE_TYPES.add(MultipartFile.class);
67+
ANNOTATIOSN_TO_IGNORE.add(Hidden.class);
6668
}
6769

6870
public GenericParameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
69-
IgnoredParameterAnnotations ignoredParameterAnnotations,
7071
PropertyResolverUtils propertyResolverUtils) {
7172
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
72-
this.ignoredParameterAnnotations = ignoredParameterAnnotations;
7373
this.propertyResolverUtils = propertyResolverUtils;
7474
}
7575

@@ -346,11 +346,23 @@ private JavaType constructType(Type type) {
346346
return TypeFactory.defaultInstance().constructType(type);
347347
}
348348

349-
public boolean isAnnotationToIgnore(java.lang.reflect.Parameter parameter) {
350-
return ignoredParameterAnnotations.isAnnotationToIgnore(parameter);
349+
public boolean isAnnotationToIgnore(MethodParameter parameter) {
350+
return ANNOTATIOSN_TO_IGNORE.stream().anyMatch(
351+
annotation -> parameter.getParameterAnnotation(annotation)!=null
352+
|| AnnotationUtils.findAnnotation(parameter.getParameterType(), annotation) != null);
351353
}
352354

353355
public static void addFileType(Class<?>... classes) {
354356
FILE_TYPES.addAll(Arrays.asList(classes));
355357
}
358+
359+
public static void addAnnotationsToIgnore(Class<?>... classes) {
360+
ANNOTATIOSN_TO_IGNORE.addAll(Arrays.asList(classes));
361+
}
362+
363+
public static void removeAnnotationsToIgnore(Class<?>... classes) {
364+
List classesToIgnore = Arrays.asList(classes);
365+
if (ANNOTATIOSN_TO_IGNORE.containsAll(classesToIgnore))
366+
ANNOTATIOSN_TO_IGNORE.removeAll(Arrays.asList(classes));
367+
}
356368
}

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ ResponseSupportConverter responseSupportConverter() {
7777
return new ResponseSupportConverter();
7878
}
7979

80-
@Bean
81-
IgnoredParameterAnnotationsDefault ignoredParameterAnnotationsDefault() {
82-
return new IgnoredParameterAnnotationsDefault();
83-
}
84-
8580
@Bean
8681
public OpenAPIBuilder openAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityParser securityParser,
8782
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, SpringDocConfigProperties springDocConfigProperties,
@@ -125,9 +120,8 @@ public GenericReturnTypeParser genericReturnTypeParser() {
125120

126121
@Bean
127122
public GenericParameterBuilder parameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
128-
IgnoredParameterAnnotations ignoredParameterAnnotations,
129123
PropertyResolverUtils propertyResolverUtils) {
130-
return new GenericParameterBuilder(localSpringDocParameterNameDiscoverer, ignoredParameterAnnotations, propertyResolverUtils);
124+
return new GenericParameterBuilder(localSpringDocParameterNameDiscoverer, propertyResolverUtils);
131125
}
132126

133127
static class ConditionOnCacheOrGroupedOpenApi extends AnyNestedCondition {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,5 +83,14 @@ public SpringDocUtils addResponseTypeToIgnore(Class<?> cls){
8383
return this;
8484
}
8585

86+
public SpringDocUtils addAnnotationsToIgnore(Class<?>... classes) {
87+
GenericParameterBuilder.addAnnotationsToIgnore( classes);
88+
return this;
89+
}
90+
91+
public SpringDocUtils removeAnnotationsToIgnore(Class<?>... classes) {
92+
GenericParameterBuilder.removeAnnotationsToIgnore( classes);
93+
return this;
94+
}
8695
}
8796

springdoc-openapi-data-rest/src/main/java/org/springdoc/core/SpringDocDataRestConfiguration.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
import io.swagger.v3.oas.models.media.MapSchema;
3030
import io.swagger.v3.oas.models.media.ObjectSchema;
3131
import io.swagger.v3.oas.models.media.StringSchema;
32+
import javassist.ClassPool;
3233
import org.springdoc.core.converters.Pageable;
3334
import org.springdoc.core.converters.QueryDslPredicateConverter;
3435
import org.springdoc.core.converters.RepresentationModelLinksOASMixin;
3536
import org.springdoc.core.customizers.OpenApiCustomiser;
3637

3738
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
38-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3939
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4040
import org.springframework.context.annotation.Bean;
4141
import org.springframework.context.annotation.Configuration;
@@ -57,22 +57,24 @@ public class SpringDocDataRestConfiguration {
5757
.replaceWithClass(org.springframework.data.domain.PageRequest.class, Pageable.class);
5858
}
5959

60-
@Bean
61-
@ConditionalOnMissingBean
62-
@ConditionalOnClass(QuerydslBindingsFactory.class)
63-
public QueryDslPredicateConverter qdslConverter(QuerydslBindingsFactory querydslBindingsFactory) {
64-
return new QueryDslPredicateConverter(querydslBindingsFactory);
65-
}
6660

67-
@Configuration
68-
@ConditionalOnClass(RepositoryRestConfiguration.class)
69-
class HalProviderConfiguration {
61+
@Configuration
62+
@ConditionalOnClass(value = {QuerydslBindingsFactory.class, ClassPool.class})
63+
class QuerydslProvider {
64+
65+
@Bean
66+
public QueryDslPredicateConverter qdslConverter(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
67+
return querydslBindingsFactory.isPresent() ? new QueryDslPredicateConverter(querydslBindingsFactory.get()) : null;
68+
}
69+
}
70+
71+
@Configuration
72+
@ConditionalOnClass(RepositoryRestConfiguration.class)
73+
class HalProviderConfiguration {
7074

7175
@Bean
7276
public HalProvider halProvider(Optional<RepositoryRestConfiguration> repositoryRestConfiguration) {
73-
if (repositoryRestConfiguration.isPresent())
74-
return new HalProvider(repositoryRestConfiguration.get());
75-
return null;
77+
return repositoryRestConfiguration.isPresent() ? new HalProvider(repositoryRestConfiguration.get()) : null;
7678
}
7779

7880
/**

springdoc-openapi-security/src/main/java/org/springdoc/core/SpringDocSecurityConfiguration.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,19 +22,21 @@
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2323
import org.springframework.context.annotation.Bean;
2424
import org.springframework.context.annotation.Configuration;
25-
import org.springframework.context.annotation.Primary;
25+
import org.springframework.security.core.Authentication;
26+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2627
import org.springframework.security.oauth2.provider.endpoint.FrameworkEndpointHandlerMapping;
2728

2829
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
30+
import static org.springdoc.core.SpringDocUtils.getConfig;
2931

3032
@Configuration
3133
@ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
3234
public class SpringDocSecurityConfiguration {
3335

34-
@Bean
35-
@Primary
36-
IgnoredParameterWithSecurity ignoredParameterAnnotationsWithSecurity() {
37-
return new IgnoredParameterWithSecurity();
36+
static {
37+
getConfig().addRequestWrapperToIgnore(Authentication.class)
38+
.addResponseTypeToIgnore(Authentication.class)
39+
.addAnnotationsToIgnore(AuthenticationPrincipal.class);
3840
}
3941

4042
@Configuration
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package test.org.springdoc.api.app98;
2+
3+
import org.springframework.web.bind.annotation.GetMapping;
4+
import org.springframework.web.bind.annotation.RestController;
5+
6+
@RestController
7+
public class HelloController {
8+
9+
@GetMapping("/persons")
10+
public void persons(@IgnoredAnnotationParameter String name) {
11+
12+
}
13+
14+
}

springdoc-openapi-common/src/main/java/org/springdoc/core/IgnoredParameterAnnotations.java renamed to springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app98/IgnoredAnnotationParameter.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
*
1717
*/
1818

19-
package org.springdoc.core;
19+
package test.org.springdoc.api.app98;
2020

21-
interface IgnoredParameterAnnotations {
22-
default boolean isAnnotationToIgnore(java.lang.reflect.Parameter parameter) {
23-
return false;
24-
}
25-
}
21+
import java.lang.annotation.Retention;
22+
import java.lang.annotation.RetentionPolicy;
2623

27-
class IgnoredParameterAnnotationsDefault implements IgnoredParameterAnnotations {}
24+
@Retention(RetentionPolicy.RUNTIME)
25+
public @interface IgnoredAnnotationParameter {
26+
String addition() default "customized parameter!";
27+
}

springdoc-openapi-security/src/main/java/org/springdoc/core/IgnoredParameterWithSecurity.java renamed to springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app98/SpringDocApp98Test.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,20 @@
1616
*
1717
*/
1818

19-
package org.springdoc.core;
19+
package test.org.springdoc.api.app98;
2020

21-
import org.springframework.security.core.Authentication;
22-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2321

24-
import static org.springdoc.core.SpringDocUtils.getConfig;
22+
import org.springdoc.core.SpringDocUtils;
23+
import test.org.springdoc.api.AbstractSpringDocTest;
2524

25+
import org.springframework.boot.autoconfigure.SpringBootApplication;
2626

27-
public class IgnoredParameterWithSecurity implements IgnoredParameterAnnotations {
27+
public class SpringDocApp98Test extends AbstractSpringDocTest {
2828

29-
static {
30-
getConfig().addRequestWrapperToIgnore(Authentication .class)
31-
.addResponseTypeToIgnore(Authentication.class);
32-
}
29+
@SpringBootApplication
30+
static class SpringDocTestApp {}
3331

34-
@Override
35-
public boolean isAnnotationToIgnore(java.lang.reflect.Parameter parameter) {
36-
return parameter.isAnnotationPresent(AuthenticationPrincipal.class);
32+
static {
33+
SpringDocUtils.getConfig().addAnnotationsToIgnore(IgnoredAnnotationParameter.class);
3734
}
38-
}
35+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "OpenAPI definition",
5+
"version": "v0"
6+
},
7+
"servers": [
8+
{
9+
"url": "http://localhost",
10+
"description": "Generated server url"
11+
}
12+
],
13+
"paths": {
14+
"/persons": {
15+
"get": {
16+
"tags": [
17+
"hello-controller"
18+
],
19+
"operationId": "persons",
20+
"responses": {
21+
"200": {
22+
"description": "default response"
23+
}
24+
}
25+
}
26+
}
27+
},
28+
"components": {}
29+
}

0 commit comments

Comments
 (0)