使用组件: knife4j, 前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一个纯swagger-ui的ui皮肤项目
使用方式:引入依赖, 可以已纳入最新版本, 然后配置类swagger
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.starter.version}</version>
</dependency>
具体可以参考: http://t.csdn.cn/stFG2
一、 第一步: 网关模块配置
1.1 pom文件啊引入依赖
<!--knife4j接口-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.starter.version}</version>
</dependency>
版本:
<knife4j.starter.version>3.0.3</knife4j.starter.version>
2.2 gateway模块配置
类RouteProperties 路由来源, 获取配置文件的服务路由名称
/**
* 路由配置
*
*/
@Component
@Data
@RefreshScope
@ConfigurationProperties("project.document")
public class RouteProperties {
private final List<RouteResource> resources = new ArrayList<>();
}
获取配置中路由的属性值
@Data
public class RouteResource {
/**
* 文档名
*/
private String name;
/**
* 文档所在服务地址
*/
private String location;
/**
* 文档版本
*/
private String version;
}
对应的bootstrap.yml 配置文件, 注意对齐格式, 否则会报错
project:
document:
resources:
- name: 系统模块
location: /project-system
version: 1.0.0
- name: 数据中心
location: /project-gateway
version: 1.0.0
SwaggerProvider
@Primary
@Component
@AllArgsConstructor
public class SwaggerProvider implements SwaggerResourcesProvider {
private static final String API_URI = "/v2/api-docs";
private RouteProperties routeProperties;
/**
* 获取路由资源信息, 拼接路由地址
* @return
*/
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resources = new ArrayList<>();
List<RouteResource> routeResources = routeProperties.getResources();
routeResources.forEach(routeResource -> resources.add(swaggerResource(routeResource)));
return resources;
}
private SwaggerResource swaggerResource(RouteResource routeResource) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(routeResource.getName());
swaggerResource.setLocation(routeResource.getLocation().concat(API_URI));
swaggerResource.setSwaggerVersion(routeResource.getVersion());
return swaggerResource;
}
}
SwaggerResourceHandler: 处理已经加入的模块路由
@Slf4j
@Component
@RequiredArgsConstructor
public class SwaggerResourceHandler implements HandlerFunction<ServerResponse> {
/* 将已经配置好的路由*/
private final SwaggerProvider swaggerResources;
/**
* Handle the given request.
*
* @param request the request to handler
* @return the response
*/
@Override
public Mono<ServerResponse> handle(ServerRequest request) {
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(swaggerResources.get()));
}
}
SwaggerUiHandler:
@Slf4j
@Component
public class SwaggerUiHandler implements HandlerFunction<ServerResponse> {
/**
* Handle the given request.
*
* @param request the request to handler
* @return the response
*/
@Override
public Mono<ServerResponse> handle(ServerRequest request) {
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(UiConfigurationBuilder.builder().build()));
}
}
安全处理类:SwaggerSecurityHandler
@Slf4j
@Component
public class SwaggerSecurityHandler implements HandlerFunction<ServerResponse> {
/**
* Handle the given request.
*
* @param request the request to handler
* @return the response
*/
@Override
public Mono<ServerResponse> handle(ServerRequest request) {
return ServerResponse.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(SecurityConfigurationBuilder.builder().build()));
}
}
获取跳过的url: AuthProperties 在nocos配置或者配置文件配置的信息
@Component
@Data
@RefreshScope
@ConfigurationProperties("project.gateway")
public class AuthProperties {
/**
* 放行API集合
*/
private final List<String> skipUrl = new ArrayList<>();
}
最后上面的都汇总到配置类:SwaggerRouterFunctionConfiguration
@Slf4j
@Configuration
@AllArgsConstructor
@EnableConfigurationProperties({RouteProperties.class, AuthProperties.class})
public class SwaggerRouterFunctionConfiguration {
private final SwaggerResourceHandler swaggerResourceHandler;
private final SwaggerSecurityHandler swaggerSecurityHandler;
private final SwaggerUiHandler swaggerUiHandler;
@Bean
public RouterFunction routerFunction() {
return RouterFunctions.route(RequestPredicates.GET("/swagger-resources")
.and(RequestPredicates.accept(MediaType.ALL)), swaggerResourceHandler)
.andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui")
.and(RequestPredicates.accept(MediaType.ALL)), swaggerUiHandler)
.andRoute(RequestPredicates.GET("/swagger-resources/configuration/security")
.and(RequestPredicates.accept(MediaType.ALL)), swaggerSecurityHandler);
}
}
以上就是gateway配置的信息
二、第二步: 配置其他模块
可以放在公共模块,这样其他模块就可以不用再进行配置, 引入公共模块就可以
2.1 首先也是引入依赖:模块project-common的pom文件
<!--knife4j接口-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.starter.version}</version>
</dependency>
版本:
<knife4j.starter.version>3.0.3</knife4j.starter.version>
版本3.0.3
2.2 创建配置类, 也放在公共模块里
/**
* 对Swagger2的配置信息
*
* @author
*/
@Configuration
@EnableSwagger2 // 必需
@EnableKnife4j // 必需
public class SwaggerConfig {
private static final String VERSION = "1.0.0";
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhyqin")) // 配置扫描的包路径, 可以把范围放大些
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("project-系统接口文档")
.contact(new Contact("自学项目学习","","xxxx@163.com"))
.description("project接口文档")
.version(VERSION)
.build();
}
}
配置需要加入接口文档的接口信息, 在对应包下的controller里加入对应的注解信息
@Slf4j
@Api(value="ship", tags = "船舶管理") 这是大标题
@RestController
@RequestMapping("/ship")
@AllArgsConstructor
public class ShipController {
@ApiOperation(value = "船舶查询", notes = "根据条件查询船舶") // 这是小标题
@PostMapping("/queryByCon")
public String getData(String userName, String age){
log.info(" 入参: userName ="+userName +" , age ="+age);
return "成功!!!!";
}
}
以上就算配置完成
调用接口: 网关的地址 : http://localhost:8844/doc.html#/home
然后它会自动调用http://localhost:8844/v2/api-docs 来获取数据