项目: https://github.com/nlxs0511/springmybatisplus.git
提交版本:集成knife4j实现风格化API文档
![](https://img-blog.csdnimg.cn/20210222175918649.png)
1.pom.xml knife4j-spring-boot-starter的版本自己决定
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.配置knifeconfig
package com.test.mybatisplus.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
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;
import springfox.documentation.service.Contact;
/**
* @Description:集成knife4j实现风格化API文档
* * @param null
* @Return:
* @Author: hf
* @Time: 2021/2/22 17:03
*/
@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class Knife4jConfig {
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
.select()
// 这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage(
"com.test.mybatisplus.knife4jcontroller"))
.paths(PathSelectors.any()).build();
return docket;
}
private ApiInfo apiInfo() {
Contact contact = new Contact("kry", "", "");
return new ApiInfoBuilder().title("knife测试").
description("knife测试描述").contact(contact).version("1.0.0").build();
}
}
鼠标处可自定义扫描路径
![](https://img-blog.csdnimg.cn/20210222174803100.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM0MzM4MTYy,size_16,color_FFFFFF,t_70)
3.Knife4jTsetController
package com.test.mybatisplus.knife4jcontroller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.test.mybatisplus.entity.PressInfoEntity;
import com.test.mybatisplus.service.PressInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
* @Description mybatis-plus 通用curd测试
* @project xr
* @author:hf
* @date:
* @company:人生有限公司
*/
@Api(tags="Knife4jTsetController")
@RestController
@RequestMapping("knife")
@Slf4j
public class Knife4jTsetController {
@ApiOperation(value = "测试index接口", nickname = "测试IndexController的index接口")
@GetMapping("/index")
public String index() {
return "测试IndexController的index接口...";
}
}
![](https://img-blog.csdnimg.cn/20210222174600717.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NpbmF0XzM0MzM4MTYy,size_16,color_FFFFFF,t_70)
5.根据迭代版本显示接口
添加Version注解
package com.kry.xr.base;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description knife4j 版本注解使用
* @author:hf
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Version {
String[] versionGroup();
}
package com.kry.xr.base;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.web.context.request.async.DeferredResult;
import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.Arrays;
/**
* @Description:集成knife4j实现风格化API文档 http://localhost:8084/kry/doc.html#/home
*/
@Configuration
@EnableSwagger2
@EnableKnife4j
@Import(BeanValidatorPluginsConfiguration.class)
public class Knife4jConfig {
@Bean
public Docket admin() {
return createDocket("后台接口", "com.kry.xr.controller");
}
@Bean
public Docket service() {
return createDocket("接口", "com.kry.xr.xx.controller");
}
@Bean
public Docket version100() {
return createDocket1("v1.0.0", "100");
}
@Bean
public Docket version200() {
return createDocket1("v2.0.0", "200");
}
public Docket createDocket1(String title, String versionNum ) {
Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(title))
.groupName(title)
.genericModelSubstitutes(DeferredResult.class)
.select()
// 这里指定Controller扫描包路径
.apis(input->{ Version version = input.getHandlerMethod().getMethodAnnotation(Version.class);
if(version!=null&& Arrays.asList(version.versionGroup()).contains(versionNum)){
return true;
}
return false;
})
.paths(PathSelectors.any()).build();
return docket;
}
public Docket createDocket(String title, String path ) {
Docket docket = new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo(title))
.groupName(title)
.genericModelSubstitutes(DeferredResult.class)
.select()
// 这里指定Controller扫描包路径
.apis(RequestHandlerSelectors.basePackage(path))
.paths(PathSelectors.any()).build();
return docket;
}
private ApiInfo apiInfo(String title) {
Contact contact = new Contact("kry", "", "");
return new ApiInfoBuilder().title(title).
description("knife测试描述").contact(contact).version("1.0.0").build();
}
}
方法追加@Version注解及版本号
/**
* v1.0.0接口
* @author kry
* @since 2021-12-31
*/
@Version(versionGroup = {"100"})
@ApiOperation(value="selectV100", nickname="获取版本1.0.0")
@GetMapping(value = "selectV100", produces = { "application/json; charset=utf-8" })
public String selectV100(HttpServletRequest request) {
return buildSuccessResult("获取实体成功", "v100");
}
/**
* v1.0.0接口/v2.0.0接口
* @author kry
* @since 2021-12-31
*/
@Version(versionGroup = {"100","200"})
@ApiOperation(value="selectV200", nickname="获取版本2.0.0")
@GetMapping(value = "selectV200", produces = { "application/json; charset=utf-8" })
public String selectV200(HttpServletRequest request) {
return buildSuccessResult("获取实体成功", "v200");
}
启动之后显示
![](https://img-blog.csdnimg.cn/d30f9bc812f14cf9970db2f2bb1a66ec.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2D5Y-N55Sw55yf55qE5omT5LiN6L-H5oiR,size_13,color_FFFFFF,t_70,g_se,x_16)