freemarker使用说明_SpringBoot+Swagger2集成详细说明

SpringBoot+Swagger2集成详细说明

引言:

为什么使用Swagger?

在Vue没有出来之前,都是前后端在一起:

  • 后端用的SSM或者SSH框架

  • 前端完全就是静态页面+模板引擎。例如:JSP开发久的人应该听说过,和现在的Thymeleaf、 Velocity、FreeMarker 类似

在Vue出来之后,进入真正的前后端分离时代:

  • 后端依然可以是SSM架构,而现在大厂都在使用微服务SpringBoot、SpringCloud等

  • 前端就独立出来了,只管呈现效果也就是是三层架构的视图层

为什么叫前后端分离呢?

分离就是各自开发自己的,互不干扰

优点:

  • 前端可以不用等后端人员开发完在测试,直接就可以使用Json伪造数据测试,例如:JsonServer工具

  • 可以部署在不同的服务器上

  • 有新的项目可以随时拆分模块

缺点:

  • 此时就需要在招专业开发前端的人员,这就是老板的事了。。。

Swagger简介:

Swagger是一个流行的API开发框架,Swagger容许用户使用Swagger编辑器描述OAS 3.0API,并使用SwaggerUI可视化并自动生成OAS 3.0中定义的API文档。

Swagger可以对整个API开发周期提供一个完整框架,解决调试过程中的各种问题,包括API设计,开发,测试,完档,并且几乎支持所有语言。

Swagger的用途来了:

问题:

前后端分离联调,前后端人员无法做到及时的调试?

当年的解决方案:
  • 编写Word文档,及时更新(但是很难做到,一般容易忘记)

  • 模拟测试后端接口:postman

  • 后端开发完之后,提供接口,根据需求在调整

现在的解决方案:
  • Api文档与API定义同步更新

  • 直接运行,在线测试后端接口

  • 对多种编程语言的支持

SpringBoot集成Swagger:

1.建立SpringBoot-Web项目

d0fcced7702dfb95e003995ae9bef470.png

4ec47b1dc091482a34a9f6b0e1bcee42.png

da2d82748d9f5d0002610211ee4911af.png

2.引入Swagger依赖

Swagger UI:用于展示API规范

Springfox:是一个通过扫描代码提取代码中的信息,生成API文档的工具。API文档的格式不止Swagger的OpenAPI Specification,还有RAMLjsonapi,Springfox的目标同样包括支持这些格式。

 <dependency>    <groupId>io.springfoxgroupId>    <artifactId>springfox-swagger2artifactId>    <version>2.9.2version>dependency><dependency>    <groupId>io.springfoxgroupId>    <artifactId>springfox-swagger-uiartifactId>    <version>2.9.2version>dependency>

3.配置Swagger

 @Configuration@EnableSwagger2 // 开启Swaggerpublic class SwaggerConfig {}

4.编写Controller

 @RestControllerpublic class TestController {    @RequestMapping("hello")    public String hello(){        return "hello swagger2";    }}

6.项目结构

b658bb50042c5f803aec1c5450540efc.png

7.启动项目

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

8f549fd057c03677d43832cdb9581ecc.png

Swagger配置进阶

Swagger信息和组信息进行配置

 @Configuration@EnableSwagger2 // 开启Swaggerpublic class SwaggerConfig {//    配置Docket的bean实例    @Bean    public Docket docket(Environment environment){        return new Docket(DocumentationType.SWAGGER_2)                .apiInfo(apiInfo())                .enable(true)// enable是否启动Swagger,如果False,则Swagger不能再浏览器中访问                .groupName("yangjun")// 配置API分组                .select()//                RequestHandlerSelectors,配置扫描接口的方式//                basePackage:指定要扫描的包//                any():扫描全部//                none():不扫描//                withClassAnnotation:扫描类上的注解,参数是一个注解的反射对象//                withMethodAnnotation:扫描方法上的注解                .apis(RequestHandlerSelectors.basePackage("com.example.controller"))//                paths 过滤路径                //.path(PathSelectors.ant("/example/**"))                .build();    }//    配置Swagger信息=apiInfo    private ApiInfo apiInfo() {//      作者信息        Contact contact = new Contact("作者:XX","作者QQ空间","作者Email");        return new ApiInfo("测试SwaggerApi文档"        ,"好好学习,天天向上",                "V0.1",                "团队文档地址",                contact,                "Apache2.0",                "Apache2.0地址",                new ArrayList<>());    }}

a296e0781fa7195f0d06cee1c8349987.png

问题来了:

如果我们只在测试环境中使用,而不在生产环境中使用该怎么办?

 enable(true)// enable是否启动Swagger,如果False,则Swagger不能再浏览器中访问
  • 判断当前的环境

  • 设置enable(true)值

 public Docket docket(Environment environment){    //设置要显示的Swagger环境    Profiles profiles = Profiles.of("dev","test");    //通过environment.acceptsProfiles判断是否处在自己设定的环境当中    boolean flag = environment.acceptsProfiles(profiles);    return new Docket(DocumentationType.SWAGGER_2)        .apiInfo(apiInfo())        .enable(flag)// enable是否启动Swagger,如果False,则Swagger不能再浏览器中访问        .groupName("yangjun")// 配置API分组        .select()        .apis(RequestHandlerSelectors.basePackage("com.example.controller"))        .build();}

配置分组

配置多个实例即可

 @Beanpublic Docket docket1(){return new Docket(DocumentationType.SWAGGER_2).groupName("测试分组1");}@Beanpublic Docket docket2(){return new Docket(DocumentationType.SWAGGER_2).groupName("测试分组2");}

0e6cdc4045afde613fe5ab0a87c6cb87.png

API使用:

涉及到的5个注解

  • @Api(tags = "类"):加在类上

  • @ApiOperation:加在方法上

  • @ApiParam("用户名"):加在参数上

  • @ApiModel("用户实体类"):加在实体类上

  • @ApiModelProperty("用户名"):加在字段上

1.@Api的使用

在类上使用主要来阐述这个类的作用

 @Api(tags = "TestController测试类")@RestControllerpublic class TestController {    @RequestMapping(value = "/hello",method = RequestMethod.GET)    public String hello(){        return "hello swagger2";    }}

f7a3bcfeea2dec4bae4d7af504ab6251.png

2.@ApiOperation的使用

在方法上使用主要来阐述这方法的用户以及需要传入那些参数和类型

 @Api(tags = "TestController测试类")@RestControllerpublic class TestController {    @RequestMapping(value = "/hello",method = RequestMethod.GET)    public String hello(){        return "hello swagger2";    }    @ApiOperation("测试控制类1")    @PostMapping("/user1")    public String getUser2(@ApiParam("用户名") User user){        return user.toString();    }}

923c49b34c31618e4cf720a18618e014.png

cc3c2bfa3b703d414500d482c48aed7f.png

32eae6e3e17dc332a394733e2c3f27d4.png

3.@ApiParam的使用

定义用户输入参数的格式,不用在拼接字符串,Swagger会自动配置好,我们只要填入参数测试

 @Api(tags = "TestController测试类")@RestControllerpublic class TestController {    @RequestMapping(value = "/hello",method = RequestMethod.GET)    public String hello(){        return "hello swagger2";    }    @ApiOperation("测试控制类1")    @PostMapping("/user1")    public String getUser2(@ApiParam("用户名") User user){        return user.toString();    }}

4c3f3a61a1612aa8df0c7527f300c460.png

4365995679810e1a26ab1ca2d04aa74f.png

4.@ApiModel和@ApiModelProperty的使用

在实体类使用,提供每个字段名和类型,关键可以和MybatisPlus一起使用,只要在数据库中定义好字段的备注,使用MP的代码自动生成就OK了

 @Data@ApiModel("用户实体类")public class User {    @ApiModelProperty("用户名")    private String name;    @ApiModelProperty("用户密码")    private String password;}

02c61f093a3c68ef42f32d96c85b0912.png

总结:

1.在开发过程中对接口更新更快

2.能够快速导出API文档

3.不用第三方工具即可测试接口

8226a147af2b0a32c28a04d2fb04129c.png

完整代码:

https://gitee.com/hahaguai007/springboot-swagger2.git

点亮 2dfe8b41dfdbacd39565272734194176.png,告诉大家你也在看 4935e78fb9347b1e679481f9d9646385.gif

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

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

相关文章

Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)

vimrc增加如下内容即可&#xff1a; vnoremap <M-> :call Duiqi(\v(^\s*\S)\s(.*))<CR> "reg匹配的第2段文字对齐 function! Duiqi(reg) let l0 line("<") let l1 line(">") "获取第1个单词及前面空格的最大长度 let…

mysql主从架构搭建_mysql主从架构搭建

背景知识&#xff1a;主从这个架构可以实现数据备份&#xff0c;数据在多个服务器上分布等等&#xff0c;当然最主要的优点是可以实现负载均衡&#xff0c;将写操作交给主节点&#xff0c;读操作交给从节点。mysql官网有很多版本&#xff0c;例如Enterprise(企业版需要付费&…

Linux快速搭建FTP服务器

FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作系统有不同的FTP应用程序…

mysql 连接 监控_mysql监控优化(一)连接数和缓存

一、mysql的连接数MYSQL数据库安装完成后&#xff0c;默认最大连接数是100&#xff0c;一般流量稍微大一点的论坛或网站这个连接数是远远不够的&#xff0c;连接数少的话&#xff0c;在大并发下连接数会不够用&#xff0c;会有很多线程在等待其他连接释放&#xff0c;就可能会导…

day35-hibernate映射 03-Hibernate持久态对象自动更新数据库

持久态对象一个非常重要的能力:自动更新数据库。 package cn.itcast.hibernate3.demo1;import static org.junit.Assert.*;import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test;import cn.itcast.utils.HibernateUtils;/*** Hibernate的测…

go 删除 文件 某行_Go实战--用echo嵌入静态资源

生命不止&#xff0c;继续 go go go !!!使用 Go 开发应用的时候&#xff0c;有时会遇到需要读取静态资源的情况。比如开发 Web 应用&#xff0c;程序需要加载模板文件生成输出的 HTML。在程序部署的时候&#xff0c;除了发布应用可执行文件外&#xff0c;还需要发布依赖的静态资…

python 运维自动化之路 Day2

学习内容&#xff1a; 1、模块初识 2、Pyc是什么 3、Python数据类型 4、数据运算 5、bytes数据类型 6、列表和元组的使用 7、字符串常用操作 8、字典的使用 1、模块初识 如果用 python 解释器来编程&#xff0c;从 Python 解释器退出再进入&#xff0c;那么你定义的所有的方法和…

aMDcpu不支持mysql_Oracle 11.2.0.1在AMD CPU 64位硬件,32位操作系统下的BUG 8670579

通过查询meatlink原因是在ORACLE11.2.0.1 AMD 64位CPU下安装了32位的操作系统&#xff0c;触发了bug 8670579&#xff0c;那要解决该问题只需打上86705bug 8670579硬件信息&#xff1a;CPU:AMD X6在执行dbca的时候也报错如下&#xff1a;[Oracleyorkshi ~]$ dbca## An unexpect…

《网络攻防》第6周作业

20169310 2016-2017-2 《网络攻防实践》第6周学习总结 教材学习内容总结 本周主要学习了《网络攻防---技术与实践》第5、6章的内容&#xff0c;主要学习了 TCP/IP网络协议攻击 和 网络安全防范技术 TCP/IP网络协议攻击概述 网络安全的属性&#xff1a;机密性 、完整性 、可用性…

nios ii小实验——第一个demo指导书

1.新建工程&#xff1a;打开Quartus II 13.0&#xff0c;点击File->New Project Wizard&#xff0c;点击Next后可以看到如图2所示的对话框&#xff0c;选择工程路径给工程命名&#xff08;注意&#xff1a;工程名必须和顶层模块名一致&#xff0c;否则编译会报错&#xff09…

算法交易系列研究之一

一、算法交易的概念 &#xff08;一&#xff09;什么是算法交易 算法交易&#xff08;Algorithmic Trading&#xff09;是一种程序化交易方式&#xff0c;它将交易者和市场有机地联系起来。算法交易通常可以减少这两者之间的摩擦&#xff0c;或者说在一定程度上可以降低交易对市…

Spring3系列7- 自动扫描组件或Bean

原文地址 &#xfeff;&#xfeff;http://www.cnblogs.com/leiOOlei/p/3547589.html 一、 Spring Auto Scanning Components —— 自动扫描组件     1. Declares Components Manually——手动配置component 2. Auto Components Scanning——自动扫描组件 3…

CI Weekly #17 | flow.ci 支持 Java 构建以及 Docker/DevOps 实践分享

这周一&#xff0c;我们迫不及待写下了最新的 changelog —— 项目语言新增「Java」。创建 Java 项目工作流和其它语言项目配置很相似&#xff0c;flow.ci 提供了默认的 Java 项目构建流程模版&#xff0c;快去试试吧&#xff5e; 最近 flow.ci 2017 招聘计划正式启动&#xff…

python选取tensor某一维_Pytorch的Tensor操作(1)

类型推断torch.randn()&#xff1a;随机初始化a.type()&#xff1a;返回类型type()&#xff1a;返回基本类型isinstance() &#xff1a;检查类型cuda会影响数据类型标量维度(dimention)为0的标量标量的shape&#xff1a;返回类型为【】(空的list)&#xff0c;返回长度也为0a.di…

201521123014 《Java程序设计》第8周学习总结

201521123014 《Java程序设计》第8周学习总结 1. 本周学习总结 1.1 以你喜欢的方式&#xff08;思维导图或其他&#xff09;归纳总结集合与泛型相关内容。 泛型&#xff08;编写的代码可被不同类型的对象所重用&#xff09; Java中一个集合可以放任何类型的对象&#xff0c;因为…

【4.0】jdbcTemplate

1.什么是jdbcTemplate? 2.使用jdbcTemplate 3.crud操作 参考博文&#xff1a;http://blog.csdn.net/u014800380/article/details/64125653 4.采用配置文件的方式使用jdbcTemplate 参考博文&#xff1a;http://suyanzhu.blog.51cto.com/8050189/1563219/ 参考博文原文&#x…

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读&#xff1a;触摸屏能够直观、生动地显示运行参数和运行状态&#xff0c;而且通过触摸屏画面可以直接修改系统运行参数&#xff0c;人机交互性好。触摸屏和单片机通信&#xff0c;需要根据触摸屏采用的通信协议为单片机编…

【转】C#之继承

C#之继承 一.继承的类型  在面向对象的编程中&#xff0c;有两种截然不同继承类型&#xff1a;实现继承和接口继承  1.实现继承和接口继承  *实现继承&#xff1a;表示一个类型派生于基类型&#xff0c;它拥有该基类型的所有成员字段和函数。在实现继承中&#xff0c;派生…

java 学习计划_Java学习计划范例

Java学习计划范例Java学习计划好的计划是成功的一半&#xff0c;今天是在创新思维的第一节课&#xff0c;在这门课程的开始&#xff0c;一个有策略的、有目的性的计划是非常必要的&#xff0c;为了在以后的学习中能够达到最好的.效果&#xff0c;"坚持"是一把雕刻刀&…

SQL Server 2012自动备份

SQL 2012和2008一样&#xff0c;都可以做维护计划&#xff0c;来对数据库进行自动的备份。 现在做这样一个数据库维护的计划&#xff0c;每天0点对数据库进行差异备份&#xff0c;每周日0点对数据库进行完全备份&#xff0c;并且每天晚上10点删除一次过期备份&#xff08;两个星…