diff --git a/pom.xml b/pom.xml index b936a371ab9c8d6242707b3c47e2f170796b9da8..f8ba16c9cf822e7dcb36aef2806973f53dfc296e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,8 +5,6 @@ <groupId>org.springframework.samples</groupId> <artifactId>spring-petclinic-rest</artifactId> - <version>2.6.2</version> - <description>REST version of the Spring Petclinic sample application</description> <url>https://spring-petclinic.github.io/</url> @@ -20,14 +18,15 @@ <properties> <!-- Third librairies --> <spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.version> - <springfox-swagger.version>3.0.0</springfox-swagger.version> + <!-- <springfox-swagger.version>3.0.0</springfox-swagger.version> --> + <springdoc-openapi-ui.version>1.6.11</springdoc-openapi-ui.version> <jackson-databind-nullable.version>0.2.1</jackson-databind-nullable.version> <mapstruct.version>1.4.1.Final</mapstruct.version> <jaxb-api.version>2.3.0</jaxb-api.version> <!-- Maven plugins --> <jacoco.version>0.8.7</jacoco.version> - <openapi-generator-maven-plugin.version>5.2.1</openapi-generator-maven-plugin.version> + <openapi-generator-maven-plugin.version>6.0.1</openapi-generator-maven-plugin.version> <build-helper-maven-plugin.version>3.2.0</build-helper-maven-plugin.version> <!-- Docker --> @@ -121,11 +120,17 @@ <artifactId>json-path</artifactId> <scope>test</scope> </dependency> - <dependency> + <!-- <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>${springfox-swagger.version}</version> - </dependency> + </dependency> --> + + <dependency> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-ui</artifactId> + <version>${springdoc-openapi-ui.version}</version> + </dependency> <dependency> <groupId>org.openapitools</groupId> @@ -156,8 +161,7 @@ <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> - <version>${jaxb-api.version}</version> - </dependency> + </dependency> </dependencies> <build> @@ -267,7 +271,7 @@ <inputSpec>${project.basedir}/src/main/resources/openapi.yml</inputSpec> <generatorName>spring</generatorName> <library>spring-boot</library> - + <!-- Only enabling model andopenapi-generator-maven-plugin API generation --> <modelNameSuffix>Dto</modelNameSuffix> <apiPackage>org.springframework.samples.petclinic.rest.api</apiPackage> @@ -288,6 +292,8 @@ <openApiNullable>false</openApiNullable> <!-- override the default library to jersey2 --> <serializationLibrary>jackson</serializationLibrary> + <!-- switch documentation provider to springdoc --> + <documentationProvider>springdoc</documentationProvider> </configOptions> </configuration> </execution> @@ -296,7 +302,6 @@ <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> - <version>${build-helper-maven-plugin.version}</version> <executions> <execution> <id>add-source</id> @@ -315,7 +320,6 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>${maven-compiler-plugin.version}</version> <configuration> <annotationProcessorPaths> <path> diff --git a/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java b/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java index 8bf32512e41adf5467490e57c8a91405b93e891f..ae291140eb64698820888ce1385025e332568bba 100755 --- a/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java @@ -16,25 +16,16 @@ package org.springframework.samples.petclinic.config; +import java.util.Collections; -import org.springframework.beans.BeansException; -import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.util.ReflectionUtils; -import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider; -import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider; -import java.lang.reflect.Field; -import java.util.Collections; -import java.util.List; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; /** * Java config for Springfox swagger documentation plugin @@ -43,63 +34,35 @@ import java.util.List; */ @Configuration public class SwaggerConfig { - - @Bean - public Docket customDocket(){ - return new Docket(DocumentationType.OAS_30) - .select() - .apis(RequestHandlerSelectors.any()) - .paths(PathSelectors.any()) - .build() - .apiInfo(getApiInfo()); - } - - private ApiInfo getApiInfo() { - return new ApiInfo( - "REST Petclinic backend Api Documentation", - "This is REST API documentation of the Spring Petclinic backend. If authentication is enabled, when calling the APIs use admin/admin", - "1.0", - "Petclinic backend terms of service", - new Contact( - "Vitaliy Fedoriv", - "https://github.com/spring-petclinic/spring-petclinic-rest", - "vitaliy.fedoriv@gmail.com"), - "Apache 2.0", - "http://www.apache.org/licenses/LICENSE-2.0", Collections.emptyList()); - } - - /** - * Springfox workaround required by Spring Boot 2.6 - * See https://github.com/springfox/springfox/issues/3462 - */ + @Bean - public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() { - return new BeanPostProcessor() { + OpenAPI customOpenAPI() { - @Override - public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) { - customizeSpringfoxHandlerMappings(getHandlerMappings(bean)); - } - return bean; - } - - private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) { - mappings.removeIf(mapping -> mapping.getPatternParser() != null); - } - - @SuppressWarnings("unchecked") - private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) { - try { - Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings"); - field.setAccessible(true); - return (List<RequestMappingInfoHandlerMapping>) field.get(bean); - } catch (IllegalArgumentException | IllegalAccessException e) { - throw new IllegalStateException(e); - } - } - }; + return new OpenAPI() + .components(new Components()) + .info(new Info() + .title("REST Petclinic backend Api Documentation") + .version("1.0") + .termsOfService("Petclinic backend terms of service") + .description("This is REST API documentation of the Spring Petclinic backend. If authentication is enabled, when calling the APIs use admin/admin") + .license(swaggerLicense()) + .contact(swaggerContact())); + } + + private Contact swaggerContact() { + Contact petclinicContact = new Contact(); + petclinicContact.setName("Vitaliy Fedoriv"); + petclinicContact.setEmail("vitaliy.fedoriv@gmail.com"); + petclinicContact.setUrl("https://github.com/spring-petclinic/spring-petclinic-rest"); + return petclinicContact; + } + + private License swaggerLicense() { + License petClinicLicense = new License(); + petClinicLicense.setName("Apache 2.0"); + petClinicLicense.setUrl("http://www.apache.org/licenses/LICENSE-2.0"); + petClinicLicense.setExtensions(Collections.emptyMap()); + return petClinicLicense; } - } diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java index fab71415c72c26b8bdd8bc661d5c0c15edb22a2b..62c69ea3e0b2cbf74b9104379b86530b2e1799e5 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/OwnerRestController.java @@ -16,7 +16,11 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.Collection; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,20 +31,19 @@ import org.springframework.samples.petclinic.model.Owner; import org.springframework.samples.petclinic.model.Pet; import org.springframework.samples.petclinic.model.Visit; import org.springframework.samples.petclinic.rest.api.OwnersApi; -import org.springframework.samples.petclinic.rest.dto.*; +import org.springframework.samples.petclinic.rest.dto.OwnerDto; +import org.springframework.samples.petclinic.rest.dto.OwnerFieldsDto; +import org.springframework.samples.petclinic.rest.dto.PetDto; +import org.springframework.samples.petclinic.rest.dto.PetFieldsDto; +import org.springframework.samples.petclinic.rest.dto.VisitDto; +import org.springframework.samples.petclinic.rest.dto.VisitFieldsDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; -import javax.transaction.Transactional; -import javax.validation.constraints.Min; -import java.util.Collection; -import java.util.List; - /** * @author Vitaliy Fedoriv */ diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java index ecee18cfec930e7302415c7b0f1f83a50420ca39..bee27da2ce3c97f80f46d0863ce36570c19a0222 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetRestController.java @@ -16,7 +16,11 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.samples.petclinic.mapper.PetMapper; @@ -25,13 +29,9 @@ import org.springframework.samples.petclinic.rest.api.PetsApi; import org.springframework.samples.petclinic.rest.dto.PetDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.transaction.Transactional; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import java.util.ArrayList; -import java.util.List; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; /** * @author Vitaliy Fedoriv diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java index 213e96984c80067aa3456ef389cc81a46d793cf9..59b4735e4415301be08b782de52207d60fd9648b 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/PetTypeRestController.java @@ -16,7 +16,11 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -26,15 +30,11 @@ import org.springframework.samples.petclinic.rest.api.PettypesApi; import org.springframework.samples.petclinic.rest.dto.PetTypeDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; -import javax.transaction.Transactional; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import java.util.ArrayList; -import java.util.List; - @RestController @CrossOrigin(exposedHeaders = "errors, content-type") @RequestMapping("api") diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java index b01ccc21f7fcb02497949b017731525fa52cd522..da9e7c71886de0aa2a48e15d3ed24b633637347d 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/SpecialtyRestController.java @@ -16,7 +16,11 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -26,15 +30,11 @@ import org.springframework.samples.petclinic.rest.api.SpecialtiesApi; import org.springframework.samples.petclinic.rest.dto.SpecialtyDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; -import javax.transaction.Transactional; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import java.util.ArrayList; -import java.util.List; - /** * @author Vitaliy Fedoriv */ diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java index 8a0732c1c1468258fe4f328aeca455f67b575e14..2e5110facd565db642ae9b6b3c15a228bccb9e7d 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VetRestController.java @@ -15,7 +15,11 @@ */ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -27,15 +31,11 @@ import org.springframework.samples.petclinic.rest.api.VetsApi; import org.springframework.samples.petclinic.rest.dto.VetDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; -import javax.transaction.Transactional; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import java.util.ArrayList; -import java.util.List; - /** * @author Vitaliy Fedoriv */ diff --git a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java index c99382d0e678f9ba34f2c018cc5444ea1e7f37f2..f8066fff9a538cfca6a68ee2990ed7745027ada6 100644 --- a/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java +++ b/src/main/java/org/springframework/samples/petclinic/rest/controller/VisitRestController.java @@ -16,7 +16,11 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; +import java.util.ArrayList; +import java.util.List; + +import javax.transaction.Transactional; + import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -26,15 +30,11 @@ import org.springframework.samples.petclinic.rest.api.VisitsApi; import org.springframework.samples.petclinic.rest.dto.VisitDto; import org.springframework.samples.petclinic.service.ClinicService; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import org.springframework.web.util.UriComponentsBuilder; -import javax.transaction.Transactional; -import javax.validation.Valid; -import javax.validation.constraints.Min; -import java.util.ArrayList; -import java.util.List; - /** * @author Vitaliy Fedoriv */ diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c558a190eaf8662d51e6b07fe25f87f95c141b85..a864bc9eebd819ade56e0ba0b540d0fe501c3327 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,7 +25,7 @@ server.servlet.context-path=/petclinic/ # Springfox workaround required by Spring Boot 2.6 # See https://github.com/springfox/springfox/issues/3462 -spring.mvc.pathmatch.matching-strategy=ant_path_matcher +#spring.mvc.pathmatch.matching-strategy=ant_path_matcher spring.messages.basename=messages/messages spring.jpa.open-in-view=false @@ -40,3 +40,9 @@ logging.level.org.springframework=INFO # by default the authentication is disabled petclinic.security.enable=false +# SpringDoc autoconfiguration is disabled +# ------------------------------------------------ +#springdoc.api-docs.enabled=false +#springdoc.packagesToScan=org.springframework.samples.petclinic* +#springdoc.pathsToMatch=/* +#springdoc.swagger-ui.url=/openapi.yml \ No newline at end of file