Spring Boot集成SpringFox 3.0與Pageable參數(shù)處理方法
Springfox 3.0有多個(gè)模塊,提供了spring boot starter,與Spring Boot集成時(shí)僅需引入springfox-boot-starter,如下:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>
如果您以前使用了Springfox 2.x,需要修改一下Swagger配置:
刪除@EnableSwagger2注解,改為@EnableOpenApi
將Docket中的參數(shù)DocumentationType.SWAGGER_2改為DocumentationType.OAS_30
Springfox 3.0刪除了一些第三方模塊,如有引用需要替換
修改后的配置如下:
package com.ys.config; import com.fasterxml.classmate.TypeResolver; import org.itrunner.heroes.exception.ErrorMessage; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.ResponseEntity; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.oas.annotations.EnableOpenApi; import springfox.documentation.service.*; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import java.time.LocalDate; import java.util.List; import static java.util.List.of; @EnableOpenApi @Configuration public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30) .select() .apis(RequestHandlerSelectors.basePackage("com.ys.controller")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()) .pathMapping("/") .directModelSubstitute(LocalDate.class, String.class) .genericModelSubstitutes(ResponseEntity.class) .additionalModels(new TypeResolver().resolve(ErrorMessage.class)) .useDefaultResponseMessages(false) .securitySchemes(of(authenticationScheme())) .securityContexts(of(securityContext())) .enableUrlTemplating(false); } private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("Api Documentation") .description("Api Documentation") .contact(new Contact("xx", "http://xxxxxx", "xxxxx@163.com")) .version("1.0.0") .build(); } private HttpAuthenticationScheme authenticationScheme() { return HttpAuthenticationScheme.JWT_BEARER_BUILDER.name("BearerToken").build(); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(defaultAuth()) .operationSelector(operationContext -> operationContext.requestMappingPattern().startsWith("/api/") ) .build(); } private List<SecurityReference> defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return of(new SecurityReference("BearerToken", authorizationScopes)); } }
上面我們使用了HttpAuthenticationScheme構(gòu)建Bearer Token Authentication,在Swagger UI界面點(diǎn)擊Authorize時(shí)直接輸出token值即可。
Springfox 3.0的Swagger UI地址,從http://host/context-path/swagger-ui.html 改成了 http://host/context-path/swagger-ui/ ,OAS 3.0的api docs地址默認(rèn)為/v3/api-docs,因此Security中的ignore path要進(jìn)行相應(yīng)修改。
Pageable參數(shù)
當(dāng)REST API的方法含有org.springframework.data.domain.Pageable參數(shù)時(shí),Springfox根據(jù)接口生成pageNumber、pageSize、offset、paged、unpaged、sort.sorted、sort.unsorted等參數(shù),這與Spring Boot實(shí)際使用的參數(shù)是不一致的,因此需要針對(duì)Pageable參數(shù)進(jìn)行特殊處理。
我們使用OperationBuilderPlugin處理Pageable參數(shù),如下:
package com.ys.config; import com.fasterxml.classmate.ResolvedType; import com.fasterxml.classmate.TypeResolver; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Component; import springfox.documentation.builders.RequestParameterBuilder; import springfox.documentation.schema.ScalarType; import springfox.documentation.service.ParameterType; import springfox.documentation.service.RequestParameter; import springfox.documentation.service.ResolvedMethodParameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.OperationBuilderPlugin; import springfox.documentation.spi.service.contexts.OperationContext; import java.util.ArrayList; import java.util.List; @Component @Order public class PageableParameterReader implements OperationBuilderPlugin { private final TypeResolver resolver; @Autowired public PageableParameterReader(TypeResolver resolver) { this.resolver = resolver; } @Override public void apply(OperationContext context) { List<ResolvedMethodParameter> methodParameters = context.getParameters(); ResolvedType pageableType = resolver.resolve(Pageable.class); List<RequestParameter> parameters = new ArrayList<>(); for (ResolvedMethodParameter methodParameter : methodParameters) { ResolvedType resolvedType = methodParameter.getParameterType(); if (pageableType.equals(resolvedType)) { parameters.add(new RequestParameterBuilder() .in(ParameterType.QUERY) .name("page") .query(q -> q.model(m -> m.scalarModel(ScalarType.INTEGER))) .description("Results page you want to retrieve (0..N)").build()); parameters.add(new RequestParameterBuilder() .in(ParameterType.QUERY) .name("size") .query(q -> q.model(m -> m.scalarModel(ScalarType.INTEGER))) .description("Number of records per page").build()); parameters.add(new RequestParameterBuilder() .in(ParameterType.QUERY) .name("sort") .query(q -> q.model(m -> m.collectionModel(c -> c.model(cm -> cm.scalarModel(ScalarType.STRING))))) .description("Sorting criteria in the format: property(,asc|desc). " + "Default sort order is ascending. " + "Multiple sort criteria are supported.") .build()); context.operationBuilder().requestParameters(parameters); } } } @Override public boolean supports(DocumentationType delimiter) { return true; } }
方案一:在Controller分頁(yè)方法的Pageable參數(shù)前添加@ApiIgnore,忽略默認(rèn)的參數(shù)解析:
public ResponseEntity<List<DeviceDTO>> getAllDevices(@ApiIgnore @PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable, @RequestParam(required = false) @ApiParam(value = "關(guān)鍵字(序列號(hào),地址,歸屬單位)") String keyword,
方案二:全局配置,在SwaggerConfig類的createRestApi方法中添加:.ignoredParameterTypes(Pageable.class)
@EnableOpenApi @Configuration public class SwaggerConfig { @Bean public Docket createRestApi() { return new Docket(DocumentationType.OAS_30) .select() .apis(RequestHandlerSelectors.basePackage("com.ys.controller")) .paths(PathSelectors.any()) .build() .apiInfo(apiInfo()) .ignoredParameterTypes(Pageable.class) .pathMapping("/") .directModelSubstitute(LocalDate.class, String.class) .genericModelSubstitutes(ResponseEntity.class) .additionalModels(new TypeResolver().resolve(ErrorMessage.class)) .useDefaultResponseMessages(false) .securitySchemes(of(authenticationScheme())) .securityContexts(of(securityContext())) .enableUrlTemplating(false); }
修改后Swagger UI中顯示的Pageable參數(shù)如下:
到此這篇關(guān)于Spring Boot集成SpringFox 3.0與Pageable參數(shù)處理的文章就介紹到這了,更多相關(guān)Spring Boot集成SpringFox 3.0內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+WebSocket實(shí)現(xiàn)消息推送功能
WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。本文將通過SpringBoot集成WebSocket實(shí)現(xiàn)消息推送功能,感興趣的可以了解一下2022-08-08Mybatis-plus+通用mapper(tk.mybatis)的使用
本文主要介紹了Mybatis-plus+通用mapper(tk.mybatis)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>2024-03-03Java?EasyExcel導(dǎo)出合并單元格的示例詳解
EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱,這篇文章主要為大家介紹了如何利用EasyExcel導(dǎo)出合并單元格,需要的可以參考下2023-09-09淺談Spring AOP中args()和argNames的含義
這篇文章主要介紹了Spring AOP中args()和argNames的含義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來)
這篇文章主要介紹了Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09