diff --git a/pom.xml b/pom.xml index b936a371ab9c8d6242707b3c47e2f170796b9da8..1af53f806a04bb161eb4f6d98c8e9324a3bb7a6b 100644 --- a/pom.xml +++ b/pom.xml @@ -20,14 +20,14 @@ <properties> <!-- Third librairies --> <spring-data-jdbc.version>1.2.1.RELEASE</spring-data-jdbc.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 --> @@ -122,9 +122,9 @@ <scope>test</scope> </dependency> <dependency> - <groupId>io.springfox</groupId> - <artifactId>springfox-boot-starter</artifactId> - <version>${springfox-swagger.version}</version> + <groupId>org.springdoc</groupId> + <artifactId>springdoc-openapi-ui</artifactId> + <version>${springdoc-openapi-ui.version}</version> </dependency> <dependency> @@ -288,6 +288,8 @@ <openApiNullable>false</openApiNullable> <!-- override the default library to jersey2 --> <serializationLibrary>jackson</serializationLibrary> + <!-- switch documentation provider to springdoc --> + <documentationProvider>springdoc</documentationProvider> </configOptions> </configuration> </execution> 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..44fdae44c12484d083bf3f0792d4d19c104a0435 100755 --- a/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java +++ b/src/main/java/org/springframework/samples/petclinic/config/SwaggerConfig.java @@ -17,24 +17,16 @@ package org.springframework.samples.petclinic.config; -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 @@ -44,62 +36,31 @@ 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); - } + 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())); + } - @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); - } - } - }; + 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..b47b430a17c406bc134d5f29b7ea616ff323337c 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,6 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -31,13 +30,11 @@ import org.springframework.samples.petclinic.rest.dto.*; 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; 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..95c6af223de9d9d5e6389f18a06c14fb67b29f29 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,6 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.samples.petclinic.mapper.PetMapper; @@ -28,8 +27,6 @@ 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; 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..e2436d7a7d474923dcbe804cb63265dacf86f8a4 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,6 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -30,8 +29,6 @@ import org.springframework.web.bind.annotation.*; 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; 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..1dbbd64ef22acc10f45d3201b4557f9f531d96db 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,6 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -30,8 +29,6 @@ import org.springframework.web.bind.annotation.*; 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; 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..787bc7fa6b073f7ed3a2dfc88cc40f72397c8732 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,6 @@ */ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -31,8 +30,6 @@ import org.springframework.web.bind.annotation.*; 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; 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..bae92d2d5695f892a6d0013d3028a994720faea3 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,6 @@ package org.springframework.samples.petclinic.rest.controller; -import io.swagger.annotations.ApiParam; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -30,8 +29,6 @@ import org.springframework.web.bind.annotation.*; 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; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c558a190eaf8662d51e6b07fe25f87f95c141b85..27f427499035bc193b512706d4d3ef8d2d0dbb5e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,10 +23,6 @@ spring.profiles.active=hsqldb,spring-data-jpa server.port=9966 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.messages.basename=messages/messages spring.jpa.open-in-view=false