目录
4、呈现效果或者swagger-ui与knife4j可以切换
1、使用场景
最近自己在总结搭建一个统一数据后端的基础框架,在整合knife4j的时候出现了无法找到doc.html页面的问题。其中目前网上解决方案都是统一的一种模式,
在应用启动里面实现(implements WebMvcConfigurer)。
2、错误原因解析
因为我使用的 继承(extends WebMvcConfigurationSupport),新旧版本SpringBoot配置文件 WebMvcConfigurationSupport类 和 WebMvcConfigurer接口之间有冲突。
因为我写了一个返回后端数据统一注解ResponseResult,需要在WebMvcConfigurer/WebMvcConfigurationSupport 注入拦截器。同时考虑到不破坏启动之中类干净
显示内容,于是想到自己定义一个@Configuration类WebAppMvcConfig,去实现WebMvcConfigurer,这样就能够解决我响应结果拦截器ResponseResultInterceptor的注入,
同时比较友好的加入Knife4j的doc.html,以及swagger-ui.html页面友好显示。同时也解决了Knife4j显示404的问题。具体类如下所示:
import cn.hutool.core.date.DatePattern;
import com.whdcmap.common.response.ResponseResultInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.time.format.DateTimeFormatter;
/**
* @Description TODO
* @Classname Knife4jWebMvcConfig
* @Date 2021/3/2 15:27
* @Created by jianxiapc
*/
@Configuration
public class WebAppMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/**
* 注册自定义的显示 ResponseResult 注解的拦截器
*/
registry.addInterceptor(new ResponseResultInterceptor())
// 拦截配置
.addPathPatterns("/**")
// 排除配置
.excludePathPatterns("/error", "/login**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
/** 配置knife4j 显示文档 */
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
/**
* 配置swagger-ui显示文档
*/
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
/** 公共部分内容 */
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
3、Knife4jorSwaggerUI配置
3.1、需要引入swagger和Knife4j基本jar包如下所示
<!--Swagger-UI API文档生产工具-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<!--swagger增强工具依赖包,方便生成接口文档。非必须导入-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.8</version>
</dependency>
3.2、配置knife4j或者swaggerui基本配置信息
注意事项:一下代码如果自己的简单功能直接书写相关controller扫描包即可,我这边主要扫描注解了RestController相关类
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
示例:
//这里指定Controller扫描包路径(项目路径也行)
.apis(RequestHandlerSelectors.basePackage("com.example.knife4j.demo")
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2
@EnableKnife4j
@Configuration
public class Knife4jOrSwagger2Config {
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
Docket docket=new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
//分组名称
.groupName("测试分组")
.select()
//这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.paths(PathSelectors.any())
.build();
return docket;
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot Knife4j or swagger-bootstrap-ui API V1.0")
.description("swagger-bootstrap-ui-demo RESTful APIs")
.version("1.0")
.build();
}
}
4、呈现效果或者swagger-ui与knife4j可以切换
4.1、Knife4j显示文档
4.2、Swagger-ui显示文档