mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-05-12 20:50:55 +00:00
Do not set contextPath for spring-boot (#104)
This commit is contained in:
parent
1a4e5a4e5f
commit
71b5de3ed5
@ -18,7 +18,6 @@
|
||||
package org.openapitools.codegen.languages;
|
||||
|
||||
import com.samskivert.mustache.Mustache;
|
||||
import com.samskivert.mustache.Template;
|
||||
|
||||
import io.swagger.v3.oas.models.OpenAPI;
|
||||
import io.swagger.v3.oas.models.Operation;
|
||||
@ -41,8 +40,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@ -71,7 +68,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
public static final String SPRING_BOOT = "spring-boot";
|
||||
public static final String SPRING_CLOUD_LIBRARY = "spring-cloud";
|
||||
public static final String IMPLICIT_HEADERS = "implicitHeaders";
|
||||
public static final String SWAGGER_DOCKET_CONFIG = "swaggerDocketConfig";
|
||||
public static final String OPENAPI_DOCKET_CONFIG = "swaggerDocketConfig";
|
||||
|
||||
protected String title = "OpenAPI Spring";
|
||||
protected String configPackage = "org.openapitools.configuration";
|
||||
@ -87,7 +84,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
protected boolean useTags = false;
|
||||
protected boolean useBeanValidation = true;
|
||||
protected boolean implicitHeaders = false;
|
||||
protected boolean swaggerDocketConfig = false;
|
||||
protected boolean openapiDocketConfig = false;
|
||||
protected boolean useOptional = false;
|
||||
|
||||
public SpringCodegen() {
|
||||
@ -116,7 +113,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames"));
|
||||
cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations"));
|
||||
cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers."));
|
||||
cliOptions.add(CliOption.newBoolean(SWAGGER_DOCKET_CONFIG, "Generate Spring Swagger Docket configuration class."));
|
||||
cliOptions.add(CliOption.newBoolean(OPENAPI_DOCKET_CONFIG, "Generate Spring OpenAPI Docket configuration class."));
|
||||
cliOptions.add(CliOption.newBoolean(USE_OPTIONAL,
|
||||
"Use Optional container for optional parameters"));
|
||||
|
||||
@ -235,8 +232,8 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
this.setImplicitHeaders(Boolean.valueOf(additionalProperties.get(IMPLICIT_HEADERS).toString()));
|
||||
}
|
||||
|
||||
if (additionalProperties.containsKey(SWAGGER_DOCKET_CONFIG)) {
|
||||
this.setSwaggerDocketConfig(Boolean.valueOf(additionalProperties.get(SWAGGER_DOCKET_CONFIG).toString()));
|
||||
if (additionalProperties.containsKey(OPENAPI_DOCKET_CONFIG)) {
|
||||
this.setOpenapiDocketConfig(Boolean.valueOf(additionalProperties.get(OPENAPI_DOCKET_CONFIG).toString()));
|
||||
}
|
||||
|
||||
typeMapping.put("file", "Resource");
|
||||
@ -283,7 +280,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
supportingFiles.add(new SupportingFile("RFC3339DateFormat.mustache",
|
||||
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "RFC3339DateFormat.java"));
|
||||
supportingFiles.add(new SupportingFile("application.properties",
|
||||
("src.main.resources").replace(".", java.io.File.separator), "swagger.properties"));
|
||||
("src.main.resources").replace(".", java.io.File.separator), "openapi.properties"));
|
||||
}
|
||||
if (library.equals(SPRING_CLOUD_LIBRARY)) {
|
||||
supportingFiles.add(new SupportingFile("apiKeyRequestInterceptor.mustache",
|
||||
@ -310,7 +307,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "OpenAPIDocumentationConfig.java"));
|
||||
}
|
||||
}
|
||||
} else if (this.swaggerDocketConfig && !library.equals(SPRING_CLOUD_LIBRARY) && !this.reactive) {
|
||||
} else if (this.openapiDocketConfig && !library.equals(SPRING_CLOUD_LIBRARY) && !this.reactive) {
|
||||
supportingFiles.add(new SupportingFile("openapiDocumentationConfig.mustache",
|
||||
(sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "OpenAPIDocumentationConfig.java"));
|
||||
}
|
||||
@ -378,18 +375,10 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
}
|
||||
|
||||
// add lambda for mustache templates
|
||||
additionalProperties.put("lambdaEscapeDoubleQuote", new Mustache.Lambda() {
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
writer.write(fragment.execute().replaceAll("\"", Matcher.quoteReplacement("\\\"")));
|
||||
}
|
||||
});
|
||||
additionalProperties.put("lambdaRemoveLineBreak", new Mustache.Lambda() {
|
||||
@Override
|
||||
public void execute(Template.Fragment fragment, Writer writer) throws IOException {
|
||||
writer.write(fragment.execute().replaceAll("\\r|\\n", ""));
|
||||
}
|
||||
});
|
||||
additionalProperties.put("lambdaEscapeDoubleQuote",
|
||||
(Mustache.Lambda) (fragment, writer) -> writer.write(fragment.execute().replaceAll("\"", Matcher.quoteReplacement("\\\""))));
|
||||
additionalProperties.put("lambdaRemoveLineBreak",
|
||||
(Mustache.Lambda) (fragment, writer) -> writer.write(fragment.execute().replaceAll("\\r|\\n", "")));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -409,11 +398,7 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
} else {
|
||||
co.subresourceOperation = !co.path.isEmpty();
|
||||
}
|
||||
List<CodegenOperation> opList = operations.get(basePath);
|
||||
if (opList == null) {
|
||||
opList = new ArrayList<CodegenOperation>();
|
||||
operations.put(basePath, opList);
|
||||
}
|
||||
List<CodegenOperation> opList = operations.computeIfAbsent(basePath, k -> new ArrayList<>());
|
||||
opList.add(co);
|
||||
co.baseName = basePath;
|
||||
} else {
|
||||
@ -674,8 +659,8 @@ public class SpringCodegen extends AbstractJavaCodegen
|
||||
this.implicitHeaders = implicitHeaders;
|
||||
}
|
||||
|
||||
public void setSwaggerDocketConfig(boolean swaggerDocketConfig) {
|
||||
this.swaggerDocketConfig = swaggerDocketConfig;
|
||||
public void setOpenapiDocketConfig(boolean openapiDocketConfig) {
|
||||
this.openapiDocketConfig = openapiDocketConfig;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -13,6 +13,9 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
{{/jdk8}}
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
{{^jdk8}}
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
{{/jdk8}}
|
||||
@ -39,6 +42,9 @@ import java.util.concurrent.Callable;
|
||||
{{/jdk8}}
|
||||
{{>generatedAnnotation}}
|
||||
@Controller
|
||||
{{=<% %>=}}
|
||||
@RequestMapping("${openapi.<%title%>.base-path:<%>defaultBasePath%>}")
|
||||
<%={{ }}=%>
|
||||
{{#operations}}
|
||||
public class {{classname}}Controller implements {{classname}} {
|
||||
{{#isDelegate}}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.{{#java8}}servlet.{{/java8}}context-path={{^contextPath}}/{{/contextPath}}{{#contextPath}}{{contextPath}}{{/contextPath}}
|
||||
server.port={{serverPort}}
|
||||
spring.jackson.date-format={{basePackage}}.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,7 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
{{#reactive}}
|
||||
{{^reactive}}
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
{{contextPath}}
|
@ -0,0 +1 @@
|
||||
/
|
@ -28,7 +28,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "{{apiPackage}}")
|
||||
@EnableWebMvc
|
||||
@PropertySource("classpath:swagger.properties")
|
||||
@PropertySource("classpath:openapi.properties")
|
||||
@Import(OpenAPIDocumentationConfig.class)
|
||||
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
|
||||
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
|
||||
|
@ -1,19 +1,24 @@
|
||||
package {{configPackage}};
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
{{#useOptional}}
|
||||
|
||||
{{#useOptional}}
|
||||
import java.util.Optional;
|
||||
{{/useOptional}}
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
{{>generatedAnnotation}}
|
||||
@Configuration
|
||||
@ -33,12 +38,15 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
{{=<% %>=}}
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.<%title%>.base-path:<%>defaultBasePath%>}") String basePath) {
|
||||
<%={{ }}=%>
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("{{apiPackage}}"))
|
||||
.build()
|
||||
{{#java8}}
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
{{/java8}}
|
||||
@ -56,4 +64,25 @@ public class OpenAPIDocumentationConfig {
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,14 +35,36 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "org.openapitools.api")
|
||||
@EnableWebMvc
|
||||
@PropertySource("classpath:swagger.properties")
|
||||
@PropertySource("classpath:openapi.properties")
|
||||
@Import(OpenAPIDocumentationConfig.class)
|
||||
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
|
||||
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,14 +35,36 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "org.openapitools.api")
|
||||
@EnableWebMvc
|
||||
@PropertySource("classpath:swagger.properties")
|
||||
@PropertySource("classpath:openapi.properties")
|
||||
@Import(OpenAPIDocumentationConfig.class)
|
||||
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
|
||||
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
|
||||
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -16,6 +16,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -27,6 +28,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -11,6 +11,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -22,6 +23,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -21,6 +22,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -21,6 +22,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,11 +35,12 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.directModelSubstitute(org.threeten.bp.LocalDate.class, java.sql.Date.class)
|
||||
@ -41,4 +48,25 @@ public class OpenAPIDocumentationConfig {
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "org.openapitools.api")
|
||||
@EnableWebMvc
|
||||
@PropertySource("classpath:swagger.properties")
|
||||
@PropertySource("classpath:openapi.properties")
|
||||
@Import(OpenAPIDocumentationConfig.class)
|
||||
public class OpenAPIUiConfiguration extends WebMvcConfigurerAdapter {
|
||||
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
|
||||
|
@ -24,7 +24,7 @@ import java.util.List;
|
||||
@Configuration
|
||||
@ComponentScan(basePackages = "org.openapitools.api")
|
||||
@EnableWebMvc
|
||||
@PropertySource("classpath:swagger.properties")
|
||||
@PropertySource("classpath:openapi.properties")
|
||||
@Import(SwaggerDocumentationConfig.class)
|
||||
public class SwaggerUiConfiguration extends WebMvcConfigurerAdapter {
|
||||
private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };
|
||||
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -16,6 +16,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -27,6 +28,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -11,6 +11,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -22,6 +23,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -21,6 +22,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
@ -21,6 +22,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,11 +35,12 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.directModelSubstitute(org.threeten.bp.LocalDate.class, java.sql.Date.class)
|
||||
@ -41,4 +48,25 @@ public class OpenAPIDocumentationConfig {
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final AnotherFakeApiDelegate delegate;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final FakeApiDelegate delegate;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final FakeClassnameTestApiDelegate delegate;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final PetApiDelegate delegate;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final StoreApiDelegate delegate;
|
||||
|
@ -1,9 +1,11 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final UserApiDelegate delegate;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,14 +35,36 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -19,6 +20,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final AnotherFakeApiDelegate delegate;
|
||||
|
@ -16,6 +16,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -26,6 +27,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final FakeApiDelegate delegate;
|
||||
|
@ -9,6 +9,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -19,6 +20,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final FakeClassnameTestApiDelegate delegate;
|
||||
|
@ -11,6 +11,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -21,6 +22,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final PetApiDelegate delegate;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final StoreApiDelegate delegate;
|
||||
|
@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RequestPart;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
@ -20,6 +21,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final UserApiDelegate delegate;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,11 +35,12 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.directModelSubstitute(org.threeten.bp.LocalDate.class, java.sql.Date.class)
|
||||
@ -41,4 +48,25 @@ public class OpenAPIDocumentationConfig {
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,14 +35,36 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,7 +12,4 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,17 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import java.util.Optional;
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@ -31,15 +36,37 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.genericModelSubstitutes(Optional.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
@ -12,4 +12,7 @@ The underlying library integrating OpenAPI to SpringBoot is [springfox](https://
|
||||
|
||||
Start your server as an simple java application
|
||||
|
||||
You can view the api documentation in swagger-ui by pointing to
|
||||
http://localhost:8080/
|
||||
|
||||
Change default port value in application.properties
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class AnotherFakeApiController implements AnotherFakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeApiController implements FakeApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class FakeClassnameTestApiController implements FakeClassnameTestApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class PetApiController implements PetApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class StoreApiController implements StoreApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,10 +1,12 @@
|
||||
package org.openapitools.api;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import java.util.Optional;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("${openapi.openAPIPetstore.base-path:/v2}")
|
||||
public class UserApiController implements UserApi {
|
||||
|
||||
private final NativeWebRequest request;
|
||||
|
@ -1,16 +1,22 @@
|
||||
package org.openapitools.configuration;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
import springfox.documentation.builders.ApiInfoBuilder;
|
||||
import springfox.documentation.builders.RequestHandlerSelectors;
|
||||
import springfox.documentation.service.ApiInfo;
|
||||
import springfox.documentation.service.Contact;
|
||||
import springfox.documentation.spi.DocumentationType;
|
||||
import springfox.documentation.spring.web.paths.Paths;
|
||||
import springfox.documentation.spring.web.paths.RelativePathProvider;
|
||||
import springfox.documentation.spring.web.plugins.Docket;
|
||||
import springfox.documentation.swagger2.annotations.EnableSwagger2;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
|
||||
|
||||
@Configuration
|
||||
@EnableSwagger2
|
||||
@ -29,14 +35,36 @@ public class OpenAPIDocumentationConfig {
|
||||
}
|
||||
|
||||
@Bean
|
||||
public Docket customImplementation(){
|
||||
public Docket customImplementation(ServletContext servletContext, @Value("${openapi.openAPIPetstore.base-path:/v2}") String basePath) {
|
||||
return new Docket(DocumentationType.SWAGGER_2)
|
||||
.select()
|
||||
.apis(RequestHandlerSelectors.basePackage("org.openapitools.api"))
|
||||
.build()
|
||||
.pathProvider(new BasePathAwareRelativePathProvider(servletContext, basePath))
|
||||
.directModelSubstitute(java.time.LocalDate.class, java.sql.Date.class)
|
||||
.directModelSubstitute(java.time.OffsetDateTime.class, java.util.Date.class)
|
||||
.apiInfo(apiInfo());
|
||||
}
|
||||
|
||||
class BasePathAwareRelativePathProvider extends RelativePathProvider {
|
||||
private String basePath;
|
||||
|
||||
public BasePathAwareRelativePathProvider(ServletContext servletContext, String basePath) {
|
||||
super(servletContext);
|
||||
this.basePath = basePath;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String applicationPath() {
|
||||
return Paths.removeAdjacentForwardSlashes(UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getOperationPath(String operationPath) {
|
||||
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath("/");
|
||||
return Paths.removeAdjacentForwardSlashes(
|
||||
uriComponentsBuilder.path(operationPath.replaceFirst("^" + basePath, "")).build().toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,4 @@
|
||||
springfox.documentation.swagger.v2.path=/api-docs
|
||||
server.servlet.context-path=/v2
|
||||
server.port=80
|
||||
spring.jackson.date-format=org.openapitools.RFC3339DateFormat
|
||||
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
|
Loading…
x
Reference in New Issue
Block a user