Swagger+Spring mvc生成Restful接口文档

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。
这一次我将从零开始搭建一个工程来演示如何在Spring mvc中整合Swagger生成Restful接口文档。

 

添加Maven依赖

 <properties><spring.version>4.1.7.RELEASE</spring.version><version.jackson>2.4.4</version.jackson><swagger.version>2.2.2</swagger.version></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>com.mangofactory</groupId><artifactId>swagger-springmvc</artifactId><version>1.0.2</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${version.jackson}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${version.jackson}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${version.jackson}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.5.0</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version></dependency><!--petstore是官方的一个demo,加入此依赖是为了稍后参考接口描述的编写--><dependency><groupId>io.springfox</groupId><artifactId>springfox-petstore</artifactId><version>${swagger.version}</version></dependency></dependencies>

添加配置

添加一个ApplicationInitializer类,用于配置DispatchServlet启动:

23173410_N1si.png

在工程中的resources文件夹下新建一个spring的文件夹,并新建一个dispatcher-servlet.xml的spring mvc配置文件,添加如下内容:

23173410_quPD.png

添加一个SwaggerConfig类,用于配置Swagger接口的说明:

package com.bbd.liangdian.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;/*** Created by Administrator on 2017/3/6.*/
@EnableSwagger2
@Configuration
public class SwaggerConfig {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.bbd.liangdian.apis")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("量点项目API文档").version("1.0").description("1:量点API,根据分组查找所需要的API.<br /> 2:注意请求的方法定义.").build();}
}

新建一个GroupController,并编写测试方法:

    package yay.apidoc.controller;import io.swagger.annotations.*;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import yay.apidoc.model.UamGroup;import java.util.LinkedList;import java.util.List;/*** Created by yuananyun on 2015/11/23.*/@Controller@RequestMapping(value = "/group", produces = {"application/json;charset=UTF-8"})@Api(value = "/group", description = "群组的相关操作")public class GroupController {@RequestMapping(value = "addGroup", method = RequestMethod.PUT)@ApiOperation(notes = "addGroup", httpMethod = "POST", value = "添加一个新的群组")@ApiResponses(value = {@ApiResponse(code = 405, message = "invalid input")})public UamGroup addGroup(@ApiParam(required = true, value = "group data") @RequestBody UamGroup group) {return group;}@RequestMapping(value = "getAccessibleGroups", method = RequestMethod.GET)@ApiOperation(notes = "getAccessibleGroups", httpMethod = "GET", value = "获取我可以访问的群组的列表")public List<UamGroup> getAccessibleGroups() {UamGroup group1 = new UamGroup();group1.setGroupId("1");group1.setName("testGroup1");UamGroup group2 = new UamGroup();group2.setGroupId("2");group2.setName("testGroup2");List<UamGroup> groupList = new LinkedList<UamGroup>();groupList.add(group1);groupList.add(group2);return groupList;}}

其中UamGroup的定义如下:

    package yay.apidoc.model;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;/*** 群组*/@ApiModelpublic class UamGroup {/*** 编号*/@ApiModelProperty(value = "群组的Id", required = true)private String groupId;/*** 名称*/@ApiModelProperty(value = "群组的名称", required = true)private String name;/*** 群组图标*/@ApiModelProperty(value = "群组的头像", required = false)private String icon;public String getGroupId() {return groupId;}public void setGroupId(String groupId) {this.groupId = groupId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIcon() {return icon;}public void setIcon(String icon) {this.icon = icon;}}

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><display-name>Archetype Created Web Application</display-name><context-param><!-- 配置 spring 容器启动的配置文件的路径 --><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><context-param><param-name>logbackConfigLocation</param-name><param-value>classpath:logback.xml</param-value></context-param><listener><listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class></listener><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置编码过滤器 --><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><async-supported>true</async-supported><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置tomcat启动时 启动SpringMVC --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext-mvc.xml</param-value></init-param><load-on-startup>1</load-on-startup><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 配置swagger-ui --><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/swagger-ui.html</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><error-page><error-code>404</error-code><location>/index.html</location></error-page>
</web-app>

好,现在我们启动tomcat来看看效果: localhost:8080/swagger-ui.html

23173411_Fkfl.png

解决中文乱码

可以看到,我们写在方法上说明居然成了乱码,为了解决这个问题,我们新建一个转换类:

    package yay.apidoc.converter;import com.fasterxml.jackson.annotation.JsonInclude;import com.fasterxml.jackson.databind.*;import org.springframework.http.HttpInputMessage;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import java.io.IOException;import java.text.SimpleDateFormat;/*** Created by yuananyun on 2015/11/23.*/public class MappingJacksonHttpMessageConverterEx extends MappingJackson2HttpMessageConverter {private ObjectMapper objectMapper = new ObjectMapper();public MappingJacksonHttpMessageConverterEx() {super();DeserializationConfig deserializationConfig = objectMapper.getDeserializationConfig().without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);objectMapper.setConfig(deserializationConfig);// Configure serializationSerializationConfig serializationConfig = objectMapper.getSerializationConfig().without(SerializationFeature.FAIL_ON_EMPTY_BEANS);//serializationConfig.withDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));objectMapper.setConfig(serializationConfig);objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);//        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);setObjectMapper(objectMapper);}@Overrideprotected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)throws IOException, HttpMessageNotReadableException {JavaType javaType = getJavaType(null, clazz);return this.objectMapper.readValue(inputMessage.getBody(), javaType);}}

然后修改dispatcher-servlet.xml中的mvc:annotation-driven配置节:

        <!-- Standard xml based mvc config--><mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value></list></property></bean><bean class="yay.apidoc.converter.MappingJacksonHttpMessageConverterEx"/><bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/></mvc:message-converters></mvc:annotation-driven>

我们再来看看效果: localhost:8080/swagger-ui.html

23173411_nlSB.png

转载于:https://my.oschina.net/u/1867229/blog/885525

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

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

相关文章

JavaScript——变量与基本数据类型

前言 JavaScript中的变量为松散类型&#xff0c;所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值&#xff0c;就是不像SQL一样申明某个键值为int就只能保存整型数值&#xff0c;申明varchar只能保存字符串。一个变量所保存值的类型也可以改变&#xff0c;这在Ja…

vscode可以打开jupyternotebook吗_刚刚,官方宣布 VS Code 支持 Python 全开发了!

关注Python高校每天早上23:10准时推送北京时间 2019 年 9 月 21 日&#xff0c;PyCon China 2019 在上海举行。在下午的演讲中&#xff0c;来自微软开发工具事业部的资深研发工程师韩骏做了主题为《Python 与 Visual Studio Code 在人工智能应用中的最佳 Azure 实践》的演讲。在…

C++类的内联成员函数应放在哪

今天复习C Primer的时候&#xff0c;看到了关于C类的内联成员函数的放置&#xff0c;应该放在头文件中。那么这到底是为什么 呢&#xff1f;仅仅是一种代码规范问题还是必须这样做呢&#xff1f; 下面我就来讲讲我自己的理解吧。要彻底理解这个问题&#xff0c;首先就要了解下函…

python selenium自动化(三)Chrome Webdriver的兼容

当一个自动化测试被实现在一个浏览器之后&#xff0c;我们会希望我们的测试能够覆盖到尽量多的别的浏览器。通过跨平台的测试来保证我们的程序在多个浏览器下都能正常工作。 在安装了selenium之后&#xff0c;firefox webdriver和IE webdriver就已经是ready to use的了&#xf…

NDK 编译armebai-v7a的非4字节对齐crash Fatal signal 7 (SIGSEGV) 错误解决

一直都是编译armabi的。没有不论什么问题&#xff0c;这个架构是软件模拟浮点运算的。后来看到NDK文档上说armabi-v7a是针对有硬件处理浮点计算的arm cpu的。 于是就改动配置编译armebai-v7a的so文件。 结果是编译没问题。一执行就是crash掉&#xff0c;Fatal signal 7 (SIGSEG…

作业三

作业三 第一章问题&#xff1a;书上写的“Bug的多少可以直接衡量一个软件的开发效率、用户满意度、可靠性和可维护性”&#xff0c;那么一个比较完好的软件中一般大概会出现多少Bug? 第二章问题&#xff1a;现在开始训练写更多的程序能否更早地达到软件工程师的标准&#xff1…

springboot默认数据源如何设置连接数_Spring Boot系列之配置数据库连接池

在实际的应用开发中&#xff0c;与数据库交互通常使用数据库连接池来重用Connection对象&#xff0c;减少资源消耗。Spring Boot 的数据源是自动配置的。在 Spring Boot 2.2.1 版本中&#xff0c;有几种数据源配置可选&#xff0c;它们按照 HikariCP -> Tomcat -> DBCP2 …

使用Qt正则表达式提取全路径的文件名

问题描述&#xff1a; 给定三个全路径&#xff0c;例如 path1"C:/Users/asus/Desktop/nefertiti_4465.obj"; path2"C:/Users/asus/Desktop/nefertiti_4465_k1.txt"; path3"C:/Users/asus/Desktop/nefertiti_4465_k2.txt"; 我希望说明path2和pa…

Beyond Compare 3.3.8 build 16340 + Key

本文摘录自冰点社区&#xff1a;http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Compare 3 Current Version: 3.3.8, build 16340, released June 19, 2013 Windows 版本 Windows Standard and Pro EditionsEnglish version 5800k…

hdu 1198 Farm Irrigation

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid1198 题目大意&#xff1a; 有一大块土地需要浇水&#xff0c;这块土地由很多的小块土地&#xff08;有十一种&#xff09;组成&#xff0c;小块土地上有水沟&#xff0c;问至少需要建几个井&#xff0c;才能灌…

strcpy_s、sptintf_s与strcat_s的使用

strcpy_s、sptintf_s与strcat_s是strcpy、sptintf与strcat的安全版本&#xff0c;均是通过指定缓冲区长度来避免存在的溢出风险。 strcpy_s 与strcpy strcpy_s和strcpy函数的功能几乎是一样的。strcpy函数&#xff0c;就象gets函数一样&#xff0c;它没有方法来保证有效的缓冲…

小米一键上锁工具_小米首款高端全自动智能锁火热预售中,一触开启全自动时代...

近些年&#xff0c;随着科技的发展&#xff0c;人工智能逐渐走入大众视野。人类社会也正从信息时代向“智能时代”过渡&#xff0c;在整个过程中智能家居领域的蓬勃发展可谓当仁不让&#xff0c;一直备受用户瞩目。智能锁作为家的第一道守护防线&#xff0c;家庭物联网入口的关…

Eigen+suitesparse for windows 安装

Eigen是著名的C矩阵运算库&#xff0c;提供了许多矩阵运算的接口&#xff0c;主要包括两大部分&#xff0c;一部分是稠密矩阵&#xff0c;另一部分是稀疏矩阵。Eigen以源码形式提供给大家&#xff0c;用的时候&#xff0c;只要将源码包含在项目的包含路径上&#xff0c;具体安装…

软件盘控制的问题

2019独角兽企业重金招聘Python工程师标准>>> 在全屏模式或者是沉寝室标题栏 方案一&#xff1a;全屏模式 1.软键盘被EditText遮挡住了&#xff0c;如果说EditText被嵌套在有滑动的视图中,采取的方式是: activity中设置此属性 android:windowSoftInputMode"…

python语言学习零基础教学视频_Python告白小白视频教程(零基础入门)

1 Python编程基础入门篇通过本次课程的学习&#xff0c;我们每个人都可以进入python世界里&#xff0c;从简单到高级&#xff0c;让人人都能学会python&#xff0c;我们在学习的时候&#xff0c;python让我们的运维变得更有乐趣&#xff0c;让我们的运维更加的高大上&#xff0…

SQL 快速入门2.1

MySQL top&#xff08;MySQL limit&#xff09;语法 SELECT column_name(s) FROM table_name LIMIT number 例子 SELECT * FROM Persons LIMIT 5 SQL LIKE 操作符 SQL LIKE 操作符语法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern 原始的表 (用在例…

sencha touch 入门系列 (一)sencha touch 简介

参考链接:http://mobile.51cto.com/others-278381.htm Sencha touch 是基于JavaScript编写的Ajax框架ExtJS,将现有的ExtJS整合JQTouch、Rapha&euml;l库&#xff0c;推出适用于最前沿Touch Web的移动应用开发框架&#xff0c;该框架是世界上第一个 基于HTML5的Mobile App框架…

求二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点。 <pre name"code" class"cpp">#include <iostream> #include <queue> using namespace std;struct BTNode {char m_value;BTNode *m_left;BTNode *m_right; };//先序创建二叉…

汉堡包

在我们结对的这些天里&#xff0c;我清晰的感受到同伴对我的帮助&#xff0c;每当我有不懂的时候她都会积极的帮助我&#xff0c;也会听取我的意见积极配合我&#xff0c;在我懒惰的时候也能够提醒督促我&#xff0c;我想这些只有结对时才能体会到。我们都知道&#xff0c;结对…

zabbix自动发现监控磁盘(iops和读写量)

2019独角兽企业重金招聘Python工程师标准>>> 对于磁盘有个iops的概念比较奇怪&#xff0c;想监控起来看下&#xff0c;利用zabbix的自动发现把每个磁盘的iops监控起来&#xff0c;思路&#xff1a;自动发现所有的磁盘&#xff0c;然后监控各个磁盘的iops。效果如下图…