SpringBoot配置Swagger2与Swagger3

news2024/11/18 13:31:31

swagger是什么?

在平时开发中,一个好的API文档可以减少大量的沟通成本,还可以帮助新加入项目的同事快速上手业务。大家都知道平时开发时,接口变化总是很多,有了变化就要去维护,也是一件比较头大的事情。尤其是现在前后端分离情况,更容易造成文档和代码不一致。这时,我们可以通过Swagger2来使接口规范,方便维护。

Swagger 是一款自动生成在线文档 + 接口调试的工具。在 WEB 开发中不可否认的是我们需要给客户端提供 API 接口,这个时候需要借助 postman、rap 等工具 进行调试,以便于接口能正常交付给客户端人员,用过其它工具的应该知道一个 POST 请求一堆参数是非常枯燥且烦人的事情,而 swagger 就是让你摆脱这种束缚感....

Swagger是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器。

这个解释简单点来讲就是说,swagger是一款可以根据resutful风格生成的生成的接口开发文档,并且支持做测试的一款中间软件。

为什么要使用swaager?

对于后端开发人员来说

  • 不用再手写WiKi接口拼大量的参数,避免手写错误

  • 对代码侵入性低,采用全注解的方式,开发简单

  • 方法参数名修改、增加、减少参数都可以直接生效,不用手动维护

  • 缺点:增加了开发成本,写接口还得再写一套参数配置

对于前端开发来说

  • 后端只需要定义好接口,会自动生成文档,接口功能、参数一目了然

  • 联调方便,如果出问题,直接测试接口,实时检查参数和返回值,就可以快速定位是前端还是后端的问题

对于测试

  • 对于某些没有前端界面UI的功能,可以用它来测试接口

  • 操作简单,不用了解具体代码就可以操作

  • 操作简单,不用了解具体代码就可以操作

Swagger说明

Swagger是一款Restful接口的文档在线自动生成和功能测试功能软件。 Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的Web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

 

springboot 集成 Swagger2

1. 新建springboot工程,编写pom.xml

 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

2.编写controller

package com.ly.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TCon {

    @GetMapping("/hello")
    public String test(){
        return "hello";
    }
}

3.编写配置

 记得设置 端口号 server.port=8001

package com.ly.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2  //开启swagger2
public class SwaggerConfig  implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

4.编写启动类

package com.ly;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication
@EnableWebMvc   //增加该注解 开启
public class VueBootApp {
    public static void main(String[] args) {
        SpringApplication.run(VueBootApp.class,args);
    }
}

5.测试

由于上面的图片中的信息 有些事官方的,如果想改为自己公司的,则需要编写配置类

配置 Swagger的bean 实例 Docket

package com.ly.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
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.ArrayList;

@Configuration
@EnableSwagger2  //开启swagger2
public class SwaggerConfig  implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                //.enable(false)  //是否启动swagger ,如果为false 则不可以使用 swagger
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.ly.controller"))  //指定扫描的包
                //.paths(PathSelectors.ant("/api/**"))  //路径 过滤
                .build();
    }

    private ApiInfo apiInfo(){
        return new ApiInfo("My Swagger API document",
                "你好",
                "1.0",
                "http://www.baidu.com",
                new Contact("ly", "http://www.baidu.com", "aaa@qq.com"),  //作者信息
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList());
    }





}

再次运行localhost:8001/swagger-ui.html  

实体类也可以进行配置

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@ApiModel("用户实体类")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

    @ApiModelProperty("用户编号")
    private Long id;
    @ApiModelProperty("用户姓名")
    private String name;
    @ApiModelProperty("用户年龄")
    private int age;
    @ApiModelProperty("用户邮箱")
    private String email;

}

 

package com.ly.controller;


import com.ly.entity.User;
import com.ly.service.UserService;
import com.ly.util.Result;
import com.ly.util.StateCode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Api("vue控制类")
@RestController
@CrossOrigin   //允许跨域
public class VueController {

    @Autowired
    private UserService userService;

    @ApiOperation("修改用户信息")
    @PutMapping("/user")
    public Result<User> update(@RequestBody User user){
        userService.update(user);
        return new Result(StateCode.OK,StateCode.UPDATE_SUCCESS,user);
    }
    @ApiOperation("删除用户信息")
    @ApiImplicitParam(name = "id",value = "要删除的编号",required = true,paramType = "Long")
    @DeleteMapping("/user/{id}")
    public Result<Integer> del(@PathVariable("id") Long id){
        System.out.println("----------del---"+ id);
        userService.delById(id);
        return new Result(StateCode.OK,StateCode.QUERY_SUCCESS,null);
    }
    @ApiOperation("按照主键查询用户信息")
    @ApiImplicitParam(name = "id",value = "查询的编号",required = true,paramType = "Long")
    @GetMapping("/user/{id}")
    public Result<User> findByID( @PathVariable("id") Long id){

        User user = userService.findById(id);
        return new Result(StateCode.OK,StateCode.QUERY_SUCCESS,user);
    }


    @ApiOperation("查询全部用户信息")
    @GetMapping("/user")
    public Result<List<User>> findAll(){
        List<User> list = userService.findAll();
        return new Result(StateCode.OK,StateCode.QUERY_SUCCESS,list);
    }


    @PostMapping("/user")
    public Result<User> add(@RequestBody User user){
        Long id = userService.save(user);
        user.setId(id);
        return new Result<User>(StateCode.OK,StateCode.SAVE_SUCCESS,user);
    }

}

 

springboot 集成swagger3

 

在需要 添加swagger3 的 module 中增加依赖

  <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-boot-starter</artifactId>
             <version>3.0.0</version>
         </dependency>

swagger2 需要2个依赖, swagger3 需要1个

编写 配置类

 package com.config;
 ​
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
 import springfox.documentation.oas.annotations.EnableOpenApi;
 import springfox.documentation.service.ApiInfo;
 import springfox.documentation.service.Contact;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 ​
 import java.util.ArrayList;
 ​
 @Configuration
 @EnableOpenApi
 public class SwaggerConfig {
 ​
     @Bean
     public Docket docket(){
         return new Docket(DocumentationType.OAS_30)
                 .apiInfo(apiInfo())
                 .select()
                 //扫描指定路径下的文件
                 .apis(RequestHandlerSelectors.basePackage("com.controller"))
                 //指定路径处理,PathSelectors.any() 代表 不过滤任何路径
                 //.paths(PathSelectors.any())
                 .build();
     }
 ​
     private ApiInfo apiInfo(){
         return new ApiInfo("My Swagger API document",
                 "你好",
                 "1.0",
                 "http://www.baidu.com",
                 new Contact("ly", "http://www.baidu.com", "aaa@qq.com"),  //作者信息
                 "Apache 2.0",
                 "http://www.apache.org/licenses/LICENSE-2.0",
                 new ArrayList());
     }
 }
 ​

修改配置文件

 
spring:
   mvc:
     pathmatch:
       matching-strategy: ant_path_matcher   #swagger 使用

修改 控制层

 package com.controller;
 ​
 ​
 import com.entity.Product;
 import com.service.ProductService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RestController;
 ​
 @Api(tags = "provider控制类")
 @RestController
 public class IndexController {
 ​
 ​
     @Autowired
     private ProductService productService;
 ​
 ​
     @ApiOperation("按照编号查询")
     @GetMapping("/test/{id}")
     public Product test(@ApiParam(value = "编号",required = true,example = "1") @PathVariable("id") int id){
         return productService.findById(id);
     }
 ​
 }
 ​

 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @ApiModel("用户实体类")
 public class User {
     @ApiModelProperty(value = "姓名", required = true, example = "村雨遥")
     private String name;
 ​
     @ApiModelProperty(value = "年龄", required = true, example = "20")
     private Integer age;
 }

查看并测试接口

启动我们的项目,然后在浏览器中访问如下地址,就可以访问项目的接口文档了

http://localhost:8080/swagger-ui/index.html

访问上面的地址后,如果出现下面的界面,则说明集成 Swagger3 就成功了。

这里也要注意一点,Swagger2 中的接口访问地址是:

http://localhost:8080/swagger-ui.html

这里 Swagger2 和 Swagger3 是不同的,这里大家一定要注意,

可以进行测试了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1363057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源加解密库之GmSSL

一、简介 GmSSL是由北京大学自主开发的国产商用密码开源库&#xff0c;实现了对国密算法、标准和安全通信协议的全面功能覆盖&#xff0c;支持包括移动端在内的主流操作系统和处理器&#xff0c;支持密码钥匙、密码卡等典型国产密码硬件&#xff0c;提供功能丰富的命令行工具及…

java数据结构与算法刷题-----LeetCode64. 最小路径和

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

基于Python新闻推荐系统 大数据毕业设计 爬虫+可视化+推荐算法 vue框架+Django框架(附源码)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

常见的DOM操作有哪些?常见的BOM对象有哪些?DOM操作与BOM对象的区别?

常见的DOM操作有哪些&#xff1f; 一、DOM 文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。 它提供了对文档的结构化的表述&#xff0c;并定义了一种方式可以使从程序中对该结构进行访问&#xff0c;从而改变文档的结构&#xff0c;样式和内容。 任何 HTML或XML文档都…

FineBI:简介

1 介绍 FineBI 是帆软软件有限公司推出的一款商业智能&#xff08;Business Intelligence&#xff09;产品。 FineBI 是定位于自助大数据分析的 BI 工具&#xff0c;能够帮助企业的业务人员和数据分析师&#xff0c;开展以问题导向的探索式分析。 2 现阶段数据分析弊端 现阶…

【Java集合篇】为什么HashMap的Cap是2^n,如何保证?

为什么HashMap的Cap是2^n&#xff0c;如何保证&#xff1f; ✔️目录✔️ 为什么是2 ^ n ?✔️为什么 X %2^n X & (2^n - 1) ? ✔️如何保证✔️初始化时期保证✔️扩容时期保证 ✔️目录 ✔️ 为什么是2 ^ n ? HashMap是通过 (table.length - 1) & (key.hashCode …

swing快速入门(四十)JList、JComboBox实现列表框

注释很详细&#xff0c;直接上代码 新增内容 &#x1f9e7;1.列表的属性设置与选项监听器 &#x1f9e7;2.下拉框的属性设置与选项监听器 &#x1f9e7;3.Box中组件填充情况不符合预期的处理方法 &#x1f9e7;4.LIst向Vector的转化方法 源码&#xff1a; package swing31_40;i…

Unity中Shader序列帧动画(总结篇)

文章目录 前言一、半透明混合自定义调整1、属性面板2、SubShader中3、在片元着色器(可选)3、根据纹理情况自己调节 二、适配Build In Render Pipeline三、最终代码 前言 在前几篇文章中&#xff0c;我们依次解决了实现Shader序列帧动画所遇到的问题。 Unity中Shader序列图动画…

K8S集群部署解决工作节点couldn‘t get current server API group list问题

最近在自己电脑上装了VMWare Player&#xff0c;在上面装了两个Ubuntu虚拟机&#xff0c;为了方便学习云原生技术&#xff0c;决定在上面装一个2个节点&#xff08;一个控制面&#xff0c;一个工作节点&#xff09;的K8S集群。 参考这篇文章&#xff1a; Ubuntu 22.04 搭建K8…

WebStorm 创建一个Vue项目

一、下载并安装WebStorm 步骤一 步骤二 选择激活方式 激活码&#xff1a; I2A0QUY8VU-eyJsaWNlbnNlSWQiOiJJMkEwUVVZOFZVIiwibGljZW5zZWVOYW1lIjoiVU5JVkVSU0lEQURFIEVTVEFEVUFMIERFIENBTVBJTkFTIiwiYXNzaWduZWVOYW1lIjoiVGFvYmFv77yaSkVU5YWo5a625qG25rAIOa0uW3peS9nOWup…

MATLAB指令

01--根据数学公式进行绘制 1.绘制连续函数 ①一元函数 t0:0.1:10; y3*t2; plot(t,y) ②一元二次函数 t0:0.1:10; yt.*t; plot(t,y) 注意此处应为点乘 ③一元3次 t0:0.1:10; yt.*t.*t; plot(t,y) ④y1/t t0:0.1:10; y1./t; plot(t,y) ⑤yexp(t) t0:0.1:10; yexp(2*t); p…

实现pytorch版的mobileNetV1

mobileNet具体细节&#xff0c;在前面已做了分析记录&#xff1a;轻量化网络-MobileNet系列-CSDN博客 这里是根据网络结构&#xff0c;搭建模型&#xff0c;用于图像分类任务。 1. 网络结构和基本组件 2. 搭建组件 &#xff08;1&#xff09;普通的卷积组件&#xff1a;CBL …

光明源:智慧公厕在实际应用中作用

什么是智慧公厕呢&#xff1f; 智慧公厕是一种应用先进科技和智能化技术的公共卫生设施&#xff0c;旨在提高公厕的管理效率、服务水平以及用户体验。这类公厕整合了各种现代技术&#xff0c;包括实时监控系统、智能预约服务、在线反馈机制、卫生自动化技术、导航服务、电子支…

Git 常用命令详解及如何在IDEA中操作

文章目录 前言发现宝藏一、初识Git1.Git概述2. Git的功能3. Git运行图示 二、Git下载安装三、Git 代码托管服务1.常用的 Git 代码托管服务2.使用码云代码托管服务 四、Git 常用命令1.Git 全局设置2.获取Git 仓库3.工作区、暂存区、版本库 概念4.Git 工作区中文件的两种状态5.本…

视频云存储/视频智能分析平台EasyCVR在麒麟系统中无法启动该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

2024年阿里云、腾讯云、华为云、LightNode、硅云服务器如何选?怎么买最划算?[最新价格表]

很多小伙伴都有一颗上云的心&#xff0c;包括我自己 有事没事的折腾一下自己的小破站&#xff0c;也挺有意思的&#xff01; 那么&#xff0c;云服务器哪家好&#xff1f;优惠力度哪家大&#xff1f;活动入口哪里进&#xff1f;云服务器如何配置&#xff1f;如何选型&#xf…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量预测多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 ​1.3 缺失值分析 2 VMD经验模态分解 2.1 VMD分解实验 2.2 VMD-LSTM预测思路 3 构造训练数据 4 LSTM模型训练 5 LSTM模型预测 5.1 分量预测 5.2 可视化 时间序列预测专栏链接&#xff1a;https://blog.csdn.net/qq_…

前端Web系统架构设计

文章目录 1.目录结构定义2. 路由封装2.1 API路由定义2.2 组件路由定义 3. Axios请求开发4. 环境变量封装5. storage模块封装(sessionStorage, localStorage)6. 公共函数封装(日期,金额,权限..)7. 通用交互定义(删除二次确认,类别,面包屑...)8. 接口全貌概览 1.目录结构定义 2. …

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

基于Java实现全功能电子商城

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 基于SpringBoot的旅游网站 基于SpringBoot的MusiQ音乐网站 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及…