Skip to content

Commit a135b78

Browse files
committed
use relative baseurl since protocol relative does not work in swagger-ui, inject values through constuctor for OpenApiResource when not created by spring
1 parent 39c5947 commit a135b78

File tree

8 files changed

+54
-27
lines changed

8 files changed

+54
-27
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import io.swagger.v3.oas.models.*;
77
import io.swagger.v3.oas.models.PathItem.HttpMethod;
88
import io.swagger.v3.oas.models.responses.ApiResponses;
9+
import org.apache.commons.lang3.StringUtils;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112
import org.springdoc.core.*;
@@ -304,10 +305,10 @@ protected static String decode(String requestURI) {
304305
}
305306
}
306307

307-
protected static String getProtocolRelativeUrl(String url){
308+
protected static String getRelativeUrl(String url){
308309
try {
309310
URI uri = new URI(url);
310-
return new URI(null, uri.getHost(), uri.getPath(), null).toString();
311+
return StringUtils.appendIfMissing(new URI(null, null, uri.getPath(), null).toString(), "/");
311312
} catch (URISyntaxException e) {
312313
return url;
313314
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ public final class Constants {
1414
public static final String SPRINGDOC_SWAGGER_UI_ENABLED = "springdoc.swagger-ui.enabled";
1515
public static final String SPRINGDOC_SHOW_ACTUATOR = "springdoc.show-actuator";
1616
public static final String SPRINGDOC_SHOW_ACTUATOR_VALUE = "${" + SPRINGDOC_SHOW_ACTUATOR + ":false}";
17-
public static final String SPRINGDOC_PROTOCOL_RELATIVE_BASEURL = "springdoc.protocol-relative-baseurl";
18-
public static final String SPRINGDOC_PROTOCOL_RELATIVE_BASEURL_VALUE = "${" + SPRINGDOC_PROTOCOL_RELATIVE_BASEURL + ":false}";
17+
public static final String SPRINGDOC_RELATIVE_BASEURL = "springdoc.relative-baseurl";
18+
public static final String SPRINGDOC_RELATIVE_BASEURL_VALUE = "${" + SPRINGDOC_RELATIVE_BASEURL + ":false}";
1919
public static final String SPRINGDOC_PACKAGES_TO_SCAN = "${springdoc.packagesToScan:#{null}}";
2020
public static final String SPRINGDOC_PATHS_TO_MATCH = "${springdoc.pathsToMatch:#{null}}";
2121
public static final String SPRINGDOC_ACTUATOR_TAG = "Actuator";

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
public class SpringDocConfigProperties {
1515

1616
private Boolean showActuator = false;
17-
private Boolean protocolRelativeBaseurl = false;
17+
private Boolean relativeBaseurl = false;
1818
private Webjars webjars = new Webjars();
1919
private ApiDocs apiDocs = new ApiDocs();
2020
private List<String> packagesToScan;
@@ -36,12 +36,12 @@ public void setShowActuator(Boolean showActuator) {
3636
this.showActuator = showActuator;
3737
}
3838

39-
public Boolean getProtocolRelativeBaseurl() {
40-
return protocolRelativeBaseurl;
39+
public Boolean getRelativeBaseurl() {
40+
return relativeBaseurl;
4141
}
4242

43-
public void setProtocolRelativeBaseurl(Boolean protocolRelativeBaseurl) {
44-
this.protocolRelativeBaseurl = protocolRelativeBaseurl;
43+
public void setRelativeBaseurl(Boolean relativeBaseurl) {
44+
this.relativeBaseurl = relativeBaseurl;
4545
}
4646

4747
public Webjars getWebjars() {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
@RestController
3333
public class OpenApiResource extends AbstractOpenApiResource {
3434

35-
@Value(SPRINGDOC_PROTOCOL_RELATIVE_BASEURL_VALUE)
36-
private boolean protocolRelativBaseurl;
35+
@Value(SPRINGDOC_RELATIVE_BASEURL_VALUE)
36+
private boolean relativeBaseurl;
3737

3838
private final RequestMappingInfoHandlerMapping requestMappingHandlerMapping;
3939

@@ -87,7 +87,7 @@ protected void getPaths(Map<String, Object> restControllers) {
8787
private void calculateServerUrl(ServerHttpRequest serverHttpRequest, String apiDocsUrl) {
8888
String requestUrl = decode(serverHttpRequest.getURI().toString());
8989
String serverBaseUrl = requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length());
90-
openAPIBuilder.setServerBaseUrl(protocolRelativBaseurl ? getProtocolRelativeUrl(serverBaseUrl) : serverBaseUrl);
90+
openAPIBuilder.setServerBaseUrl(relativeBaseurl ? getRelativeUrl(serverBaseUrl) : serverBaseUrl);
9191
}
9292

9393
}

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

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import io.swagger.v3.oas.annotations.Operation;
55
import org.springdoc.core.*;
6+
import org.springframework.beans.factory.InitializingBean;
67
import org.springframework.beans.factory.ObjectFactory;
78
import org.springframework.beans.factory.annotation.Value;
89
import org.springframework.http.MediaType;
@@ -21,14 +22,39 @@
2122
import static org.springframework.util.AntPathMatcher.DEFAULT_PATH_SEPARATOR;
2223

2324
@RestController
24-
public class MultipleOpenApiResource {
25+
public class MultipleOpenApiResource implements InitializingBean {
2526

26-
private final Map<String, OpenApiResource> groupedOpenApiResources;
27+
private Map<String, OpenApiResource> groupedOpenApiResources;
28+
private final List<GroupedOpenApi> groupedOpenApis;
29+
private final ObjectFactory<OpenAPIBuilder> defaultOpenAPIBuilder;
30+
private final AbstractRequestBuilder requestBuilder;
31+
private final AbstractResponseBuilder responseBuilder;
32+
private final OperationBuilder operationParser;
33+
private final RequestMappingInfoHandlerMapping requestMappingHandlerMapping;
34+
private final Optional<ActuatorProvider> servletContextProvider;
35+
36+
@Value(SPRINGDOC_SHOW_ACTUATOR_VALUE)
37+
private boolean showActuator;
38+
39+
@Value(SPRINGDOC_RELATIVE_BASEURL_VALUE)
40+
private boolean protocolRelativBaseurl;
2741

2842
public MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
2943
ObjectFactory<OpenAPIBuilder> defaultOpenAPIBuilder, AbstractRequestBuilder requestBuilder,
3044
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
3145
RequestMappingInfoHandlerMapping requestMappingHandlerMapping, Optional<ActuatorProvider> servletContextProvider) {
46+
47+
this.groupedOpenApis = groupedOpenApis;
48+
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
49+
this.requestBuilder = requestBuilder;
50+
this.responseBuilder = responseBuilder;
51+
this.operationParser = operationParser;
52+
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
53+
this.servletContextProvider = servletContextProvider;
54+
}
55+
56+
@Override
57+
public void afterPropertiesSet() throws Exception {
3258
this.groupedOpenApiResources = groupedOpenApis.stream()
3359
.collect(Collectors.toMap(GroupedOpenApi::getGroup, item ->
3460
new OpenApiResource(
@@ -38,7 +64,8 @@ public MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
3864
operationParser,
3965
requestMappingHandlerMapping,
4066
servletContextProvider,
41-
Optional.of(item.getOpenApiCustomisers()), item.getPathsToMatch(), item.getPackagesToScan()
67+
Optional.of(item.getOpenApiCustomisers()), item.getPathsToMatch(), item.getPackagesToScan(),
68+
showActuator, protocolRelativBaseurl
4269
)
4370
));
4471
}
@@ -67,4 +94,4 @@ private OpenApiResource getOpenApiResourceOrThrow(String group) {
6794
}
6895
return openApiResource;
6996
}
70-
}
97+
}

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,6 @@
2626
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
2727

2828
import javax.servlet.http.HttpServletRequest;
29-
import java.io.UnsupportedEncodingException;
30-
import java.net.URI;
31-
import java.net.URISyntaxException;
32-
import java.net.URLDecoder;
33-
import java.nio.charset.StandardCharsets;
3429
import java.util.*;
3530

3631
import static org.springdoc.core.Constants.*;
@@ -46,8 +41,8 @@ public class OpenApiResource extends AbstractOpenApiResource {
4641
@Value(SPRINGDOC_SHOW_ACTUATOR_VALUE)
4742
private boolean showActuator;
4843

49-
@Value(SPRINGDOC_PROTOCOL_RELATIVE_BASEURL_VALUE)
50-
private boolean protocolRelativBaseurl;
44+
@Value(SPRINGDOC_RELATIVE_BASEURL_VALUE)
45+
private boolean relativBaseurl;
5146

5247
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
5348
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
@@ -61,12 +56,16 @@ public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder req
6156
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
6257
AbstractResponseBuilder responseBuilder, OperationBuilder operationParser,
6358
RequestMappingInfoHandlerMapping requestMappingHandlerMapping, Optional<ActuatorProvider> servletContextProvider,
64-
Optional<List<OpenApiCustomiser>> openApiCustomisers, List<String> pathsToMatch, List<String> packagesToScan) {
59+
Optional<List<OpenApiCustomiser>> openApiCustomisers, List<String> pathsToMatch, List<String> packagesToScan,
60+
boolean showActuator, boolean relativBaseurl) {
6561
super(openAPIBuilder, requestBuilder, responseBuilder, operationParser, openApiCustomisers, pathsToMatch, packagesToScan);
6662
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
6763
this.servletContextProvider = servletContextProvider;
64+
this.showActuator = showActuator;
65+
this.relativBaseurl = relativBaseurl;
6866
}
6967

68+
7069
@Operation(hidden = true)
7170
@GetMapping(value = API_DOCS_URL, produces = MediaType.APPLICATION_JSON_VALUE)
7271
public String openapiJson(HttpServletRequest request, @Value(API_DOCS_URL) String apiDocsUrl)
@@ -136,6 +135,6 @@ private boolean isRestController(Map<String, Object> restControllers, HandlerMet
136135
private void calculateServerUrl(HttpServletRequest request, String apiDocsUrl) {
137136
String requestUrl = decode(request.getRequestURL().toString());
138137
String calculatedUrl = requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length());
139-
openAPIBuilder.setServerBaseUrl(protocolRelativBaseurl ? getProtocolRelativeUrl(calculatedUrl) : calculatedUrl);
138+
openAPIBuilder.setServerBaseUrl(relativBaseurl ? getRelativeUrl(calculatedUrl) : calculatedUrl);
140139
}
141140
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app71/SpringDocApp71Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33
import org.springframework.test.context.TestPropertySource;
44
import test.org.springdoc.api.AbstractSpringDocTest;
55

6-
@TestPropertySource(properties = "springdoc.protocol-relative-baseurl=true")
6+
@TestPropertySource(properties = "springdoc.relative-baseurl=true")
77
public class SpringDocApp71Test extends AbstractSpringDocTest {
88
}

springdoc-openapi-webmvc-core/src/test/resources/results/app71.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"servers": [
88
{
9-
"url": "//localhost",
9+
"url": "/",
1010
"description": "Generated server url"
1111
}
1212
],

0 commit comments

Comments
 (0)