springboot集成knife4j实现多版本接口返回

项目: https://github.com/nlxs0511/springmybatisplus.git

提交版本:集成knife4j实现风格化API文档

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();
    }
}

鼠标处可自定义扫描路径

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接口...";
    }


}

4.启动项目 请求http://localhost:8084/mybatisplus//doc.html#/home

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");
    }

启动之后显示 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值