SpringBoot集成Swagger3(powernode document)(内含源代码)

news2024/11/28 18:39:15

SpringBoot集成Swagger3(powernode document)(内含源代码)

源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87449720

目录

  • SpringBoot集成Swagger3(powernode document)(内含源代码)
  • `源代码下载链接地址:`[https://download.csdn.net/download/weixin_46411355/87449720](https://download.csdn.net/download/weixin_46411355/87449720)
    • 一、问题描述
    • 二、使用步骤
      • 2.1 创建SpringBoot项目加入依赖
      • 2.2 application.yml配置文件
      • 2.3 创建SwaggerProperties信息配置类
      • 2.4 创建SwaggerAutoConfiguration自动配置类
      • 2.5 创建Hero类
      • 2.6创建Controller
      • 2.7 修改application.yml配置文件
      • 2.8运行启动类
      • 2.9 解决报错
        • 2.9.1 报错1
          • 2.9.1.1 报错信息
          • 2.9.1.2 解决报错办法
        • 2.9.2 报错2
          • 2.9.2.1 报错信息2
          • 2.9.2.2 解决报错方法
        • 2.9.3 修改后的application.yml文件
      • 2.10 测试访问文档页面
      • 2.11 测试接口
      • 2.12 补充注解说明
    • 三、变式
      • 3.1 引入AjaxResult
      • 3.2 controller层的改变

一、问题描述

随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、前后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 前端和后端的唯一联系,变成了API接口;API文档变成了前后端开发人员联系的纽带,变得越来越重要,swagger就是一款让你更好的书写API文档的框架,而且swagger可以完全模拟http请求,入参出参和实际情况差别几乎为零。
没有API文档工具之前,大家都是手写API文档的(维护起来相当困难),在什么地方书写的都有,有在confluence上写的,有在对应的项目目录下readme.md上写的,每个公司都有每个公司的玩法,无所谓好坏。但是能称之为“框架”的,估计也只有swagger了

API接口文档:是根据controller设计的文档
文档的编写方式:
1.手写 使用某个格式文件
2.使用工具 提高编写与维护文档的效率
3.使用文档框架

我们在设计controller后,文档框架自动根据我们设计好的controller生成文档
好处:
1.文档自动生成。提高编写效率
2.我们修改了controller,则文档也会跟着修改。提高维护效率

目前流行的文档框架:swagger

接口地址入参说明返回值备注
http://localhost:8080/doLoginusername:用户名Password:密码{code:200,msg:ok,data:null}用户登录

二、使用步骤

2.1 创建SpringBoot项目加入依赖

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

2.2 application.yml配置文件

swagger3:
  base-package: com.bjpowernode.controller
  name: cxs
  url: https://gitee.com/smiledouble
  email: 775610843@qq.com
  version: 1.0
  group-name: cxs
  title: "测试"
  description: "测试swagger文档"
  terms-of-service-url: https://gitee.com/smiledouble
  license: cxs
  license-url: https://gitee.com/smiledouble
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  mvc:
    format:
      date-time: yyyy-MM-dd HH:mm:ss

2.3 创建SwaggerProperties信息配置类

SwaggerProperties.java

package com.bjpowernode.swaggerdemo.config;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Component
@ConfigurationProperties(prefix = "swagger3")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class SwaggerProperties {
    /**
     * 扫描的包
     * 给这个包下面的接口创建文档
     */
    private String basePackage;

    /**
     * 作者姓名
     */
    private String name;


    /**
     * 作者主页链接
     */
    private String url;

    /**
     * 作者邮箱
     */
    private String email;

    /**
     * 版本号
     */
    private String version;

    /*
    * 分组名称
    */
    private String groupName;

    /**
     * 文档标题
     */
    private String title;

    /**
     * 文档描述
     */
    private String description;

    /**
     * 组织地址
     */
    private String termsOfServiceUrl;

    /**
     * 许可证
     */
    private String license;

    /**
     * 许可链接
     */
    private String licenseUrl;
}

2.4 创建SwaggerAutoConfiguration自动配置类

package com.bjpowernode.swaggerdemo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;

@EnableConfigurationProperties(SwaggerProperties.class)
@EnableOpenApi//开启swagger的功能 旧版本是@EnableSwagger2
@Configuration
public class SwaggerAutoConfiguration {

    @Autowired
    private SwaggerProperties swaggerProperties;

    @Bean
    public Docket docket(){
        return new Docket(DocumentationType.OAS_30)
                .apiInfo(getApiInfo())
                .groupName(swaggerProperties.getGroupName())
                .select()
                .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
                .build();
    }

    private ApiInfo getApiInfo(){
        Contact contact = new Contact(swaggerProperties.getName(),swaggerProperties.getUrl(),swaggerProperties.getEmail());
        return new ApiInfo(swaggerProperties.getTitle(),
                swaggerProperties.getDescription(),
                swaggerProperties.getVersion(),
                swaggerProperties.getTermsOfServiceUrl(),
                contact,
                swaggerProperties.getLicense(),
                swaggerProperties.getLicenseUrl(),
                new ArrayList());
    }

}

2.5 创建Hero类

package com.bjpowernode.swaggerdemo.domain;

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

import java.util.Date;
import java.util.List;
import java.util.Map;

@AllArgsConstructor
@NoArgsConstructor
@Data

@ApiModel("英雄对象")   //描述实体类
public class Hero {
    @ApiModelProperty(value = "英雄的id")
    private Integer id;
    @ApiModelProperty(value = "英雄的名称")
    private String name;
    @ApiModelProperty(value = "英雄的地址")
    private String address;
    @ApiModelProperty(value = "英雄的生日")
    private Date birth;
    @ApiModelProperty(value = "英雄的爱好")
    private List<String> hobby;
    @ApiModelProperty(value = "英雄的map")
    private Map<String,String> mapl;

}

2.6创建Controller

package com.bjpowernode.swaggerdemo.controller;

import com.bjpowernode.swaggerdemo.domain.Hero;
import com.sun.corba.se.spi.ior.ObjectKey;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@RestController
@Api(tags = "英雄的管理接口")
public class HeroConroller {
    /**
     * @ApiImplicitParam注解 表示单独的请求参数,用在方法上
     *      paramType : 参数放在哪个地方
     *              path : 用于restful接口-->请求参数的获取 : @PathVariable
     * @param id
     * @return
     */
    @ApiOperation("根据id获取英雄")
    @ApiImplicitParam(name = "id",value = "英雄编号(必填)",required = true,dataType = "Integer",paramType = "path")
    @GetMapping("/getHero/{id}")
    public Hero getHeroById(@PathVariable("id") Integer id){
        HashMap<String,String> map = new HashMap<>();
        map.put("技能","射箭");
        return new Hero(id,"后裔","峡谷",new Date(), Arrays.asList("打猎"),map);

    }

    @ApiOperation("添加英雄")
    @PostMapping("/addHero")
    public Map<String,Object> addHero(@RequestBody Hero hero){
        System.out.println(hero);
        HashMap<String, Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","ok");
        return map;
    }

    /**
     * @ApiImplicitParam注解 表示单独的请求参数,用在方法上
     *      paramType : 参数放在哪个地方
     *             query : 请求参数的获取 @RequestParam
     * @param id
     * @return
     */
    @DeleteMapping("delHero")
    @ApiOperation("根据id删除一个英雄")
    @ApiImplicitParam(name = "id",value = "英雄编号",required = true,paramType = "query",dataType = "Integer")
    public Map<String,Object> delHero(@RequestParam Integer id){
        System.out.println(id);
        HashMap<String,Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","ok");
        return map;
    }

}

2.7 修改application.yml配置文件

在这里插入图片描述

2.8运行启动类

2.9 解决报错

2.9.1 报错1

2.9.1.1 报错信息

Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

在这里插入图片描述

2.9.1.2 解决报错办法

请看笔者的另一篇博文《解决报错 Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.的三种办法》——https://huanghaoheng.blog.csdn.net/article/details/129020202

2.9.2 报错2

2.9.2.1 报错信息2

Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerException

2.9.2.2 解决报错方法

请查看笔者的另一篇博文:《解决报错Failed to start bean ‘documentationPluginsBootstrapper‘; nested exception is java.lang.NullPoint》——https://huanghaoheng.blog.csdn.net/article/details/128884811

在application.yml文件下,加如下配置

spring:
  mvc:
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER

2.9.3 修改后的application.yml文件

在这里插入图片描述

swagger3:
  base-package: com.bjpowernode.swaggerdemo.controller
  name: cxs
  url: https://gitee.com/smiledouble
  email: 775610843@qq.com
  version: 1.0
  group-name: cxs
  title: "测试"
  description: "测试swagger文档"
  terms-of-service-url: https://gitee.com/smiledouble
  license: cxs
  license-url: https://gitee.com/smiledouble
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  mvc:
    format:
      date-time: yyyy-MM-dd HH:mm:ss
    pathmatch:
      matching-strategy: ANT_PATH_MATCHER
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:13306/ssm_power_edu?useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: root

2.10 测试访问文档页面

http://localhost:8080/swagger-ui/index.html
在这里插入图片描述

2.11 测试接口

在这里插入图片描述

2.12 补充注解说明

https://gumutianqi1.gitbooks.io/specification-doc/content/tools-doc/spring-boot-swagger2-guide.html

在这里插入图片描述

三、变式

3.1 引入AjaxResult

com.bjpowernode.swaggerdemo.common.AjaxResult

AjaxResult.java

package com.bjpowernode.swaggerdemo.common;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 设计用来以json格式字符串的方式响应给前端的对象
 */
@Data
@Accessors(chain = true)
public class AjaxResult {
    private boolean issuccess;//声明处理请求是否成功
    private Integer code;//声明处理请求响应给前端的状态码
    private String message;//声明响应给前端用来提示用户的信息
    private Object content;//响应给前端用来展示的具体数据

    /**
     * 返回响应成功的AjaxResult对象
     * 指定具体Content
     */
    public static AjaxResult success(Object content){
        AjaxResult ajaxResult = new AjaxResult();

        ajaxResult.setIssuccess(true)
                .setCode(200)
                .setMessage("响应成功")
                .setContent(content);

        return ajaxResult;
    }

    public static AjaxResult success(){
        AjaxResult ajaxResult = new AjaxResult();

        ajaxResult.setIssuccess(true)
                .setCode(200)
                .setMessage("响应成功");
        return ajaxResult;
    }

    /**
     * 返回响应失败的AjaxResult对象
     */
    public static AjaxResult fail(String message){
        AjaxResult ajaxResult = new AjaxResult();
        ajaxResult.setIssuccess(false).setCode(400).setMessage(message);
        return ajaxResult;
    }

}

3.2 controller层的改变

@ApiOperation("根据id获取英雄")
    @ApiImplicitParam(name = "id", value = "英雄编号(必填)", required = true, dataType = "Integer", paramType = "path")
    @ApiResponses({
            @ApiResponse(code = 408, message = "指定业务的报错信息,返回客户端"),
            @ApiResponse(code = 400, message = "请求参数没填好"),
            @ApiResponse(code = 404, message = "请求路径没有或页面跳转路径不对")
    })
    @GetMapping("/getHeroByAjaxResult/{id}")
    public AjaxResult getHeroByIdAndAjaxResult(@PathVariable("id") Integer id) {
        Hero hero = new Hero();

        List<String> hobby = Arrays.asList("游泳", "打乒乓球");

        HashMap<String, String> map = new HashMap<>();
        map.put("技能", "吐丝");

        hero.setId(id).setName("蜘蛛侠").setAddress("美国").setBirth(new Date()).setHobby(hobby).setMap(map);

        return AjaxResult.success(hero);
    }
 @ApiOperation("添加英雄")
    @ApiResponses({
            @ApiResponse(code = 408, message = "指定业务的报错信息,返回客户端"),
            @ApiResponse(code=400,message = "请求参数没填好"),
            @ApiResponse(code = 400,message = "请求路径没有或页面跳转路径不对")
    })
    @PostMapping("/addHeroByAjaxResult")
    public AjaxResult addHeroByAjaxResult(@RequestBody Hero hero) {
        System.out.println(hero);
        return AjaxResult.success(hero);
    }
 @DeleteMapping("/delHeroByAjaxResult")
    @ApiOperation("根据id删除一个英雄")
    @ApiImplicitParam(name = "id",value = "英雄编号",required = true,paramType = "query",dataType = "Integer")
    public AjaxResult delHeroByAjaxResult(@RequestParam Integer id){
        System.out.println(id);
        /*
        * 这里省略删除英雄的业务逻辑代码
        */
        return AjaxResult.success("成功删除id为"+id+"的hero");
    }

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

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

相关文章

数据库锁的12连问,你顶得了嘛?

前言 金三银四很快就要来啦&#xff0c;准备了数据库锁的12连问&#xff0c;相信大家看完肯定会有帮助的。 1. 为什么需要加锁 在日常生活中&#xff0c;如果你心情不好想静静&#xff0c;不想被比别人打扰&#xff0c;你就可以把自己关进房间里&#xff0c;并且反锁。这就是…

Simulink自动代码生成:如何标准化的建模?以MAB,MISRA C 2012建模规范为例

目录 为什么要规范建模 MAB&#xff0c;MISRA C2012建模规范步骤 常用的规范总结 生成代码配置 总结 为什么要规范建模 MathWorks 咨询委员会 (MAB) 规范规定了在 Simulink 和 Stateflow 中建模的重要基本规则。这些建模规范的总体目的是让控制系统模型的建模者和使用方能…

自定义ESLint规则和修复功能

这是接上一篇自定义ESLint规则开发与使用的后续扩展&#xff0c;之前文章中详细讲述了怎么创建一个自定义的规则&#xff0c;这篇文章讲述怎么实现ESLint在检测出有问题的代码时&#xff0c;怎么自动fix问题。 比如我们要检测项目中所有http的协议&#xff0c;将其替换为https协…

Power BI 存储模式介绍(导入、DirectQuery、双)

本系列的文章&#xff1a; 《Power BI windows下载安装流程&#xff09;》《Power BI 11个必学官方示例数据案例&#xff08;附下载链接&#xff09;》《Power BI 数据导入&#xff08;SQL Server、MySQL、网页数据&#xff09;》 一、背景原因 一般情况下&#xff0c;我们是…

测试开发面试基础题

1.对测试开发的理解 测试开发首先离不开测试&#xff0c;而软件测试是指&#xff0c;在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。 而且&#xff0c;现在不仅仅是通过手工测试来发…

安装less-loader5出现webpack版本不兼容

今天遇到一个问题&#xff1a; 安装less-loader5之后其它包提示peerDependencies WARNING&#xff0c;意思是包版本不兼容。 【难题】 虽然NPM已经很自动化了&#xff0c;但依赖问题真的是一个难题&#xff0c;无法自动解决&#xff0c;需要人工干预调整。 【解决办法】 去查…

用户选择好用的投票小程序最有用的投票小程序微信推送里投票制作教程

“夏日非遗传承活动”网络评选投票_用户选择好用的投票小程序_最有用的投票小程序用户在使用微信投票的时候&#xff0c;需要功能齐全&#xff0c;又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便&#xff0c;用户可以随时使用手机微信小程序获得线上投票服务…

医学生考研考博太卷,一篇文章轻松助力上岸——生物信息学及R语言基础知识之向量的生成(一)

考研考博太卷了,卷不过,想没想过本科发一篇文章呢? 330分考研人淘汰390分考研人这个故事,大家应该都知道吧。 本专栏带你六个月内,搞定一篇文章,本科生发文章也很容易。 在卷考研的同时,再卷一篇SCI,你就是新一任卷王。 本专栏教你不用花钱发一篇生信文章,从三个方…

带你了解软件测试是做什么的

软件测试是互联网技术中一门重要的学科&#xff0c;它是软件生命周期中不可或缺的一个环节&#xff0c;担负着把控、监督软件的质量的重任。 人才稀缺&#xff0c;对于求职者来说就意味着机会。但是很多想学习软件测试的人对这个学科并不了解&#xff0c;也不知道该如何学习&a…

Vue3的新特性

文章目录1 生命周期的变化2 使用proxy代替defineProperty2.1 Object.defineProperty()语法2.2 Proxy的语法3 Diff算法的提升3.1 以往的渲染策略3.2 Vue3的突破4 TypeScript的支持5 优化打包体积6 新的响应性 API6.1 reactive()6.2 <script setup>6.3 nextTick()6.4 react…

【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译

文章目录【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译摘要1. 简介2. 方法2.1 半监督框架概述2.2 监督局部对比学习2.3 下采样和块划分3. 实验4. 结论【半监督医学图像分割 2022 MICCAI】CLLE 论文翻译 论文题目&#xff1a;Semi-supervised Contrastive Learning for Labe…

Kafka 消息队列

目录主流的消息队列消息队列的应用场景缓存/肖锋解耦异步处理KafkaKafka的定义Kafka的底层基础架构Kafka分区如何保证Leader选举Kafka分区如何保证Leader和Follower数据的一致性Kafka 中消费者的消费方式Kafka 高效读写数据的原因&#xff08;高性能吞吐的原因&#xff09;&…

chatGPT爆火让我们反思——人工智能是新的加密货币吗?

核冬天技术末日到来了&#xff0c;只有人工智能幸免于难。峰值 AI 指标无处不在。它能保持加密失去的信念吗&#xff1f;作者&#xff1a;John Luttig 翻译: Chainwise核冬天技术末日到来了&#xff1a;软件、SPAC、金融科技和加密货币都进入了深度冻结状态。AI 可能是唯一穿着…

JavaWeb_RequestResponse

目录 一、概述 二、Request对象 1.Request继承体系 2.Request获取请求数据 ①获取请求行数据 ②获取请求头数据 ③获取请求体数据 ④获取请求参数 3.Request请求转发 三、Response 1.Response设置响应数据功能 ①响应行 ②响应头 ③响应体 2.请求重定向 3.路径问…

原生开发 之 微信小程序

目录 一、前期预备 1. 预备知识 ​2. 注册账号 - 申请AppID 3. 下载小程序开发工具 4. 小程序项目结构 ​5. 小程序的MVVM架构 二、创建小程序项目 1. 查看注册的appId ​2. 创建项目 ​3. 新建页面 01 - 创建text页面文件夹 ​02 - 新建text的page ​03 - 在app.json中配置 ​…

Python Paramiko stdout 多进程 阻塞 卡住 问题解决

使用paramiko进程远程操作时&#xff0c;如果缓冲区满了&#xff0c;exec_command在写入该缓冲区时会产生阻塞并一直保持阻塞状态&#xff0c;直到缓冲区被清空为止。 使用multiprocessing无疑会加重这种情况&#xff0c;其中一种解决办法是设置exec_command的get_pty参数为Tru…

商城业务:购物车

人生在世如身处荆棘之中&#xff0c;心不动&#xff0c;人不妄动&#xff0c;不动则不伤&#xff1b;如心动则人妄动&#xff0c;伤其身痛其骨&#xff0c;于是体会到世间诸般痛苦。 1、购物车需求 1&#xff09;、需求描述&#xff1a; - 用户可以在登录状态下将商品添加到购…

【项目】---快速搜索工具

目录 一、项目背景 二、项目需求分析 三、项目涉及的知识点 四、项目实现的基础理论 五、项目框架 六、增加系统工具模块 6.1、扫描本地的文件的功能 七、增加数据管理模块 7.1、先了解数据库sqlite 7.2 封装sqlite数据库管理类 7.3、封装数据管理类 7.3.1增加搜索…

成都女子情人节给东莞男子送巧克力,却被后者典当后换成望京卡牌

一年一度的情人节已经来临&#xff0c;每年的这个时候&#xff0c;都是少男少女们欢庆的节日&#xff0c;因为他们可以借助送礼物&#xff0c;各自表达对另一半的爱慕之情。然而由于中国人的传统观念&#xff0c;一般都是男方给女方送礼物&#xff0c;女方给男方送礼物的就凤毛…

宝塔搭建实战php开源likeadmin通用管理移动端uniapp源码(四)

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 上一期给大家分享了pc端的部署方式&#xff0c;今天来给大家分享uniapp端在本地搭建&#xff0c;与打包发布到宝塔的方法。感兴趣的朋友可以自行下载学习。 技术架构 vscode node16 vue3 uniapp vite types…