本文共 5172 字,大约阅读时间需要 17 分钟。
1、先展示下效果
2、实现过程
1> 引入依赖:
2.0.5 2.9.2 com.github.xiaoymin knife4j-spring-boot-starter ${knife4j.version} io.springfox springfox-swagger2 ${swagger.version} io.springfox springfox-bean-validators ${swagger.version}
2> 公共模块书写配置文件
@Configuration@EnableSwagger2@EnableKnife4j@Import(BeanValidatorPluginsConfiguration.class)public class SwaggerConfig { @Bean(value = "XXXApi") @Order(value = 1) public Docket groupRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build() .securityContexts(Lists.newArrayList(securityContext())) .securitySchemes(Lists.newArrayList(apiKey())); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("XXXXX接口文档").description("") .contact(new Contact("Minco", "", "")).version("1.0-FAST").build(); } private ApiKey apiKey() { return new ApiKey("TOKEN", "token", "header"); } private SecurityContext securityContext() { return SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("/.*")).build(); } List defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return Lists.newArrayList(new SecurityReference("BearerToken", authorizationScopes)); }}
3> gateway模块
@Component@Primary@AllArgsConstructorpublic class SwaggerProvider implements SwaggerResourcesProvider { public static final String API_URI = "/v2/api-docs"; private final RouteLocator routeLocator; private final GatewayProperties gatewayProperties; @Override public Listget() { List resources = new ArrayList<>(); List routes = new ArrayList<>(); // 取出gateway的route routeLocator.getRoutes().subscribe(route -> routes.add(route.getId())); // 结合配置的route-路径(Path),和route过滤,只获取有效的route节点 // 打开下面注释可以自动扫描接入gateway的服务,为了演示,只扫描system gatewayProperties.getRoutes().stream().filter(routeDefinition -> routes.contains(routeDefinition.getId())) .forEach(routeDefinition -> routeDefinition.getPredicates().stream() .filter(predicateDefinition -> ("Path").equalsIgnoreCase(predicateDefinition.getName())) .forEach(predicateDefinition -> resources .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs() .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", API_URI))))); return resources; } private SwaggerResource swaggerResource(String name, String location) { SwaggerResource swaggerResource = new SwaggerResource(); swaggerResource.setName(name); swaggerResource.setLocation(location); swaggerResource.setSwaggerVersion("2.0"); return swaggerResource; }}
@RestController@RequestMapping("/swagger-resources")public class SwaggerHandler { @Autowired(required = false) private SecurityConfiguration securityConfiguration; @Autowired(required = false) private UiConfiguration uiConfiguration; private final SwaggerResourcesProvider swaggerResources; @Autowired public SwaggerHandler(SwaggerResourcesProvider swaggerResources) { this.swaggerResources = swaggerResources; } @GetMapping("/configuration/security") public Mono> securityConfiguration() { return Mono.just(new ResponseEntity<>( Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()), HttpStatus.OK)); } @GetMapping("/configuration/ui") public Mono > uiConfiguration() { return Mono.just(new ResponseEntity<>( Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK)); } @SuppressWarnings("rawtypes") @GetMapping("") public Mono swaggerResources() { return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK))); }}
@RestController@Api(tags = "扫呗测试")public class TestCtrl extends BaseController { @GetMapping("test") @ApiOperation(value = "测试接收消息", notes = "") public R loginSilde( String msg) { return R.ok("接收消息:"+msg); }}
转载地址:http://xjnab.baihongyu.com/