Skip to content

Commit 70f66d6

Browse files
author
springdoc
committed
fixes #210
1 parent c74f82f commit 70f66d6

File tree

13 files changed

+225
-3
lines changed

13 files changed

+225
-3
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.springdoc.core.*;
1212
import org.springframework.beans.factory.annotation.Value;
1313
import org.springframework.core.annotation.AnnotationUtils;
14+
import org.springframework.util.AntPathMatcher;
1415
import org.springframework.util.CollectionUtils;
1516
import org.springframework.web.bind.annotation.RequestMapping;
1617
import org.springframework.web.bind.annotation.RequestMethod;
@@ -24,6 +25,7 @@
2425
import java.util.stream.Stream;
2526

2627
import static org.springdoc.core.Constants.SPRINGDOC_PACKAGES_TO_SCAN;
28+
import static org.springdoc.core.Constants.SPRINGDOC_PATHS_TO_MATCH;
2729

2830
public abstract class AbstractOpenApiResource {
2931

@@ -36,6 +38,9 @@ public abstract class AbstractOpenApiResource {
3638
private boolean computeDone;
3739
@Value(SPRINGDOC_PACKAGES_TO_SCAN)
3840
private List<String> packagesToScan;
41+
@Value(SPRINGDOC_PATHS_TO_MATCH)
42+
private List<String> pathsToMatch;
43+
private final AntPathMatcher antPathMatcher = new AntPathMatcher();
3944

4045
protected AbstractOpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
4146
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
@@ -267,4 +272,7 @@ private PathItem buildPathItem(RequestMethod requestMethod, Operation operation,
267272
protected boolean isPackageToScan(String aPackage) {
268273
return CollectionUtils.isEmpty(packagesToScan) || packagesToScan.stream().anyMatch(pack -> aPackage.equals(pack) || aPackage.startsWith(pack + "."));
269274
}
275+
protected boolean isPathToMatch(String operationPath) {
276+
return CollectionUtils.isEmpty(pathsToMatch) || pathsToMatch.stream().anyMatch(pattern -> antPathMatcher.match(pattern, operationPath));
277+
}
270278
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public final class Constants {
1313
public static final String SPRINGDOC_SHOW_ACTUATOR = "springdoc.show.actuator";
1414
public static final String SPRINGDOC_SHOW_ACTUATOR_VALUE = "${" + SPRINGDOC_SHOW_ACTUATOR + ":false}";
1515
public static final String SPRINGDOC_PACKAGES_TO_SCAN ="${springdoc.packagesToScan:#{null}}";
16+
public static final String SPRINGDOC_PATHS_TO_MATCH ="${springdoc.pathsToMatch:#{null}}";
1617
public static final String SPRINGDOC_ACTUATOR_TAG = "Actuator";
1718
public static final String DEFAULT_WEB_JARS_PREFIX_URL = "/webjars";
1819
public static final String WEB_JARS_PREFIX_URL = "${springdoc.webjars.prefix:#{T(org.springdoc.core.Constants).DEFAULT_WEB_JARS_PREFIX_URL}}";

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class SpringDocConfigProperties {
1313
private Webjars webjars = new Webjars();
1414
private ApiDocs apiDocs = new ApiDocs();
1515
private List<String> packagesToScan;
16+
private List<String> pathsToMatch;
1617

1718
public static class Webjars {
1819
private String prefix = "/webjars";
@@ -84,4 +85,12 @@ public ApiDocs getApiDocs() {
8485
public void setApiDocs(ApiDocs apiDocs) {
8586
this.apiDocs = apiDocs;
8687
}
88+
89+
public List<String> getPathsToMatch() {
90+
return pathsToMatch;
91+
}
92+
93+
public void setPathsToMatch(List<String> pathsToMatch) {
94+
this.pathsToMatch = pathsToMatch;
95+
}
8796
}

springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ protected void getPaths(Map<String, Object> restControllers) {
7474
Map<String, String> regexMap = new LinkedHashMap<>();
7575
operationPath = PathUtils.parsePath(operationPath, regexMap);
7676
if (operationPath.startsWith(DEFAULT_PATH_SEPARATOR)
77-
&& restControllers.containsKey(handlerMethod.getBean().toString()) && isPackageToScan(handlerMethod.getBeanType().getPackage().getName())) {
77+
&& restControllers.containsKey(handlerMethod.getBean().toString()) && isPackageToScan(handlerMethod.getBeanType().getPackage().getName()) && isPathToMatch(operationPath)) {
7878
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
7979
calculatePath(openAPIBuilder, handlerMethod, operationPath, requestMethods);
8080
}
@@ -87,4 +87,5 @@ private void calculateServerUrl(ServerHttpRequest serverHttpRequest, String apiD
8787
String serverBaseUrl = requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length());
8888
openAPIBuilder.setServerBaseUrl(serverBaseUrl);
8989
}
90+
9091
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package test.org.springdoc.api.app64;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RestController;
6+
7+
@RestController
8+
public class HelloController {
9+
10+
@GetMapping("/v1/test")
11+
public void test1(String hello) {
12+
}
13+
14+
@GetMapping(value = "/api/balance/abcd")
15+
@Operation(summary = "This is the test endpoint")
16+
public String test2( String from) {
17+
return "This is a fake test";
18+
}
19+
20+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package test.org.springdoc.api.app64;
2+
3+
import org.junit.AfterClass;
4+
import org.junit.BeforeClass;
5+
import test.org.springdoc.api.AbstractSpringDocTest;
6+
7+
public class SpringDocApp64Test extends AbstractSpringDocTest {
8+
9+
@BeforeClass
10+
public static void beforeClass() {
11+
System.setProperty("springdoc.pathsToMatch", "/v1, /api/**");
12+
}
13+
14+
@AfterClass
15+
public static void afterClass() {
16+
System.clearProperty("springdoc.pathsToMatch");
17+
}
18+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package test.org.springdoc.api.app64;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.context.annotation.ComponentScan;
6+
7+
@SpringBootApplication
8+
@ComponentScan(basePackages = {"org.springdoc", "test.org.springdoc.api.app64"})
9+
public class SpringDocTestApp {
10+
public static void main(String[] args) {
11+
SpringApplication.run(SpringDocTestApp.class, args);
12+
}
13+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "OpenAPI definition",
5+
"version": "v0"
6+
},
7+
"servers": [
8+
{
9+
"url": "",
10+
"description": "Generated server url"
11+
}
12+
],
13+
"paths": {
14+
"/api/balance/abcd": {
15+
"get": {
16+
"tags": [
17+
"hello-controller"
18+
],
19+
"summary": "This is the test endpoint",
20+
"operationId": "test2",
21+
"parameters": [
22+
{
23+
"name": "from",
24+
"in": "query",
25+
"required": true,
26+
"schema": {
27+
"type": "string"
28+
}
29+
}
30+
],
31+
"responses": {
32+
"200": {
33+
"description": "default response",
34+
"content": {
35+
"*/*": {
36+
"schema": {
37+
"type": "string"
38+
}
39+
}
40+
}
41+
}
42+
}
43+
}
44+
}
45+
},
46+
"components": {}
47+
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.beans.factory.annotation.Value;
1515
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1616
import org.springframework.http.MediaType;
17+
import org.springframework.util.AntPathMatcher;
1718
import org.springframework.util.CollectionUtils;
1819
import org.springframework.web.bind.annotation.GetMapping;
1920
import org.springframework.web.bind.annotation.RequestMethod;
@@ -89,13 +90,13 @@ private void calculatePath(Map<String, Object> restControllers, Map<RequestMappi
8990
String operationPath = CollectionUtils.isEmpty(patterns) ? "/" : patterns.iterator().next();
9091
Map<String, String> regexMap = new LinkedHashMap<>();
9192
operationPath = PathUtils.parsePath(operationPath, regexMap);
92-
if (isRestController(restControllers, handlerMethod, operationPath) && isPackageToScan(handlerMethod.getBeanType().getPackage().getName())) {
93+
94+
if (isRestController(restControllers, handlerMethod, operationPath) && isPackageToScan(handlerMethod.getBeanType().getPackage().getName()) && isPathToMatch(operationPath)) {
9395
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
9496
calculatePath(openAPIBuilder, handlerMethod, operationPath, requestMethods);
9597
}
9698
}
9799
}
98-
99100
private boolean isRestController(Map<String, Object> restControllers, HandlerMethod handlerMethod,
100101
String operationPath) {
101102
boolean result;
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package test.org.springdoc.api.app64;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.RequestMapping;
6+
import org.springframework.web.bind.annotation.RequestMethod;
7+
import org.springframework.web.bind.annotation.RestController;
8+
9+
import javax.servlet.http.HttpServletRequest;
10+
import javax.servlet.http.HttpServletResponse;
11+
import javax.servlet.http.HttpSession;
12+
import java.util.Locale;
13+
14+
@RestController
15+
public class HelloController {
16+
17+
@GetMapping("/v1/test")
18+
public void test1(String hello) {
19+
}
20+
21+
@GetMapping(value = "/api/balance/abcd")
22+
@Operation(summary = "This is the test endpoint")
23+
public String test2( String from) {
24+
return "This is a fake test";
25+
}
26+
27+
}

0 commit comments

Comments
 (0)