弹簧引导集成SpringFox大摇大摆的可分页参数问题

  

春季启动项目中常使用springfox-swagger来生成REST API文档,使用springfox-swagger-ui进行API测试。

  
 <代码> & lt; dependency>
  & lt; groupId> io.springfox
  & lt; artifactId> springfox-swagger2
  & lt; version> 2.8.0
  & lt;/dependency>
  & lt; dependency>
  & lt; groupId> io.springfox
  & lt; artifactId> springfox-swagger-ui
  & lt; version> 2.8.0
  & lt;/dependency>  
  

REST API方法的参数含有org.springframework.data.domain.Pageable时,如未进行其它配置,大摇大摆根据接口可分页的get/方法生成了pageNumber,页大小,抵消,分页,unpaged, sort.sorted, sort.unsorted等参数,但实际上这些参数是无效的。

  
 <代码> @ApiOperation (value=" https://www.yisu.com/zixun/Find公司")
  @GetMapping (value=" https://www.yisu.com/airlines ")
  公共PagesearchAirlines(航空航空公司,可分页可分页){
  返回repository.findAll (org.springframework.data.domain.Example.of(航空公司),可分页);
  } 
  

弹簧引导解析可分页参数的过程请查看org.springframework.data.web.PageableHandlerMethodArgumentResolver的resolveArgument()方法:

  
 <代码> @Override
  公共可分页resolveArgument (MethodParameter MethodParameter, @Nullable ModelAndViewContainer mavContainer,
  NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) {
  
  assertPageableUniqueness (methodParameter);
  
  OptionaldefaultOrFallback=getDefaultFromAnnotationOrFallback (methodParameter) .toOptional ();
  
  字符串pageString=webRequest。getParameter (getParameterNameToUse (pageParameterName methodParameter));
  字符串pageSizeString=webRequest。getParameter (getParameterNameToUse (sizeParameterName methodParameter));
  
  Optional页面=parseAndApplyBoundaries (pageString整数。MAX_VALUE,真正的);
  Optional页大?parseAndApplyBoundaries (pageSizeString maxPageSize,假);
  
  如果(! (page.isPresent (),,pageSize.isPresent ()),,! defaultOrFallback.isPresent ()) {
  返回Pageable.unpaged ();
  }
  
  int p=page.orElseGet (()→defaultOrFallback.map(可分页::getPageNumber) .orElseThrow (IllegalStateException::新));
  int ps=pageSize.orElseGet (()→defaultOrFallback.map(可分页::getPageSize) .orElseThrow (IllegalStateException::新));//限制下界
  ps=p & lt;1 ?defaultOrFallback.map(可分页::getPageSize) .orElseThrow (IllegalStateException::新):ps;//限制上限
  ps=ps比;maxPageSize吗?maxPageSize: ps;=sortResolver排序。resolveArgument (methodParameter mavContainer、webRequest binderFactory);
  
  PageRequest返回。(p, p,
  sort.isSorted () ?排序:defaultOrFallback.map(可分页::getSort) .orElseGet(::无序));
  } 
  

其中使用的参数名称为页面大小,排序,因此通过大摇大摆传入的参数是无效的。解决方法有以下几种:

  

@ApiImplicitParams

  

使用@ApiImplicitParams隐式添加页,大小,排序参数,使用@ApiIgnore忽略可分页参数。缺点,每个方法都要添加,比较繁琐。

  
 <代码> @ApiOperation (value=" https://www.yisu.com/zixun/Find公司")
  @ApiImplicitParams ({
  @ApiImplicitParam (name=耙趁妗?数据类型=罢?paramType=安檠?value=" https://www.yisu.com/zixun/Results页面你想检索(0 . . N)”),
  @ApiImplicitParam (name=按笮 ?数据类型=罢?paramType=安檠?value=" https://www.yisu.com/zixun/Number每页的记录。”),
  @ApiImplicitParam (name=芭判颉?allowMultiple=true,数据类型=白址?paramType=安檠?
  值=" https://www.yisu.com/zixun/Sorting格式标准:财产(asc | desc)。默认排序顺序是提升。支持多种排序标准”)。
  })
  @GetMapping (value=" https://www.yisu.com/airlines ")
  公共PagesearchAirlines(航空公司航空公司@ApiIgnore可分页可分页){
  返回repository.findAll (org.springframework.data.domain.Example.of(航空公司),可分页);
  } 
  

OperationBuilderPlugin

  

添加OperationBuilderPlugin组件,遇到可分页时自动添加页,大小,排序参数,同时也需使用@ApiIgnore忽略可分页参数。

  
 <代码>进口com.fasterxml.classmate.ResolvedType;
  进口com.fasterxml.classmate.TypeResolver;
  进口com.google.common.base.Function;
  进口并不知道;
  进口org.springframework.beans.factory.annotation.Autowired;
  进口org.springframework.core.Ordered;
  进口org.springframework.core.annotation.Order;
  进口org.springframework.data.domain.Pageable;
  进口org.springframework.stereotype.Component;
  进口springfox.documentation.builders.ParameterBuilder;
  进口springfox.documentation.schema.ResolvedTypes;
  进口springfox.documentation.schema.TypeNameExtractor;
  进口springfox.documentation.schema.ModelReference;
  进口springfox.documentation.service.Parameter;
  进口springfox.documentation.service.ResolvedMethodParameter;
  进口springfox.documentation.spi.DocumentationType;
  进口springfox.documentation.spi.schema.contexts.ModelContext;
  进口springfox.documentation.spi.service.OperationBuilderPlugin;
  进口springfox.documentation.spi.service.contexts.OperationContext;
  进口springfox.documentation.spi.service.contexts.ParameterContext;
  
  进口静态com.google.common.collect.Lists.newArrayList;
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

弹簧引导集成SpringFox大摇大摆的可分页参数问题