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.pswp.cn/news/259079.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259079.shtml
英文地址,請注明出處:http://en.pswp.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。效果如下圖…