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