一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring MVC+FastJson+Swagger集成的完整實例教程

Spring MVC+FastJson+Swagger集成的完整實例教程

2021-04-24 11:18vbirdbest Java教程

這篇文章主要給大家分享介紹了關(guān)于Spring MVC+FastJson+Swagger集成的完整實例教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

基礎(chǔ)部分

1. fastjson 簡介

fastjson是一個java庫,可用于將java對象轉(zhuǎn)換為json表示。它也可以被用來將一個json字符串轉(zhuǎn)換成一個等效的java對象。在轉(zhuǎn)換速度上應(yīng)該是最快的,幾乎成為了項目的標(biāo)配(在ajax請求和接口開發(fā)時一般都會用fastjson而不再使用jackson)。

github: https://github.com/alibaba/fastjson

特性:

  • 在服務(wù)器端和android客戶端提供最佳性能
  • 提供簡單tojsonstring()和parseobject()方法的java對象轉(zhuǎn)換為json,反之亦然
  • 允許存在的無法改變的對象轉(zhuǎn)換為從json
  • java泛型的廣泛支持
  • 允許自定義表示對象
  • 支持任意復(fù)雜的對象(深繼承層次結(jié)構(gòu)和廣泛使用泛型類型)

主要特點:

  • 快速fast (比其它任何基于java的解析器和生成器更快,包括jackson)
  • 強(qiáng)大(支持普通jdk類包括任意java bean class、collection、map、date或enum)
  • 零依賴(沒有依賴其它任何類庫除了jdk)
  • 支持注解

2. fastjson api

fastjson api入口類是com.alibaba.fastjson.json,常用的序列化操作都可以在json類上的靜態(tài)方法直接完成。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 把json文本parse為jsonobject或者jsonarray
public static final object parse(string text);
 
// 把json文本parse成jsonobject
public static final jsonobject parseobject(string text);
 
// 把json文本parse為javabean
public static final <t> t parseobject(string text, class<t> clazz);
 
// 把json文本parse成jsonarray
public static final jsonarray parsearray(string text);
 
// 把json文本parse成javabean集合
public static final <t> list<t> parsearray(string text, class<t> clazz);
 
// 將javabean序列化為json文本
public static final string tojsonstring(object object);
 
// 將javabean序列化為帶格式的json文本
public static final string tojsonstring(object object, boolean prettyformat);
 
// 將javabean轉(zhuǎn)換為jsonobject或者jsonarray
public static final object tojson(object javaobject);

jsonarray:相當(dāng)于list<object>

jsonobject:相當(dāng)于map<string, object>

serializeconfig: 是對序列化過程中一些序列化過程的特殊配置, 如對一些字段進(jìn)行格式處理(日期、枚舉等)

serializewriter:相當(dāng)于stringbuffer

serializerfeature屬性 :

  • quotefieldnames 輸出key時是否使用雙引號,默認(rèn)為true
  • usesinglequotes 使用單引號而不是雙引號,默認(rèn)為false
  • writemapnullvalue 是否輸出值為null的字段,默認(rèn)為false
  • writeenumusingtostring enum輸出name()或者original,默認(rèn)為false
  • useiso8601dateformat date使用iso8601格式輸出,默認(rèn)為false
  • writenulllistasempty list字段如果為null,輸出為[],而非null
  • writenullstringasempty 字符類型字段如果為null,輸出為”“,而非null
  • writenullnumberaszero 數(shù)值字段如果為null,輸出為0,而非null
  • writenullbooleanasfalse boolean字段如果為null,輸出為false,而非null
  • skiptransientfield 如果是true,類中的get方法對應(yīng)的field是transient,序列化時將會被忽略。默認(rèn)為true
  • sortfield 按字段名稱排序后輸出。默認(rèn)為false
  • writetabasspecial 把\t做轉(zhuǎn)義輸出,默認(rèn)為false 不推薦
  • prettyformat 結(jié)果是否格式化,默認(rèn)為false
  • writeclassname 序列化時寫入類型信息,默認(rèn)為false。反序列化是需用到
  • disablecircularreferencedetect 消除對同一對象循環(huán)引用的問題,默認(rèn)為false
  • writeslashasspecial 對斜杠'/'進(jìn)行轉(zhuǎn)義
  • browsercompatible 將中文都會序列化為\uxxxx格式,字節(jié)數(shù)會多一些,但是能兼容ie 6,默認(rèn)為false
  • writedateusedateformat 全局修改日期格式,默認(rèn)為false。json.deffault_date_format = “yyyy-mm-dd”;json.tojsonstring(obj, serializerfeature.writedateusedateformat);
  • disablecheckspecialchar 一個對象的字符串屬性中如果有特殊字符如雙引號,將會在轉(zhuǎn)成json時帶有反斜杠轉(zhuǎn)移符。如果不需要轉(zhuǎn)義,可以使用這個屬性。默認(rèn)為false
  • notwriterootclassname 含義
  • beantoarray 將對象轉(zhuǎn)為array輸出
  • writenonstringkeyasstring
  • notwritedefaultvalue
  • browsersecure
  • ignorenonfieldgetter
  • writeenumusingname

實戰(zhàn)部分

Spring MVC+FastJson+Swagger集成的完整實例教程

1、pom.xml 中引入spring mvc、 fastjson 依賴

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelversion>4.0.0</modelversion>
 <groupid>com.mengdee</groupid>
 <artifactid>platform-springmvc-webapp</artifactid>
 <packaging>war</packaging>
 <version>0.0.1-snapshot</version>
 <name>platform-springmvc-webapp maven webapp</name>
 <url>http://maven.apache.org</url>
 
 <properties>
 <project.build.sourceencoding>utf-8</project.build.sourceencoding>
 <junit.version>3.8.1</junit.version>
 <log4j.version>2.5</log4j.version>
 <jstl.version>1.2</jstl.version>
 <spring.version>4.2.3.release</spring.version>
 <fastjson.version>1.2.32</fastjson.version>
 
 </properties>
 
 <dependencies>
 <dependency>
 <groupid>junit</groupid>
 <artifactid>junit</artifactid>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>
 
 <dependency>
 <groupid>javax.servlet</groupid>
 <artifactid>jstl</artifactid>
 <version>${jstl.version}</version>
 </dependency>
 
 <!-- springframework -->
 <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>org.springframework</groupid>
 <artifactid>spring-context</artifactid>
 <version>${spring.version}</version>
 </dependency>
 <dependency>
 <groupid>org.springframework</groupid>
 <artifactid>spring-context-support</artifactid>
 <version>${spring.version}</version>
 </dependency>
 <dependency>
 <groupid>org.springframework</groupid>
 <artifactid>spring-jdbc</artifactid>
 <version>${spring.version}</version>
 </dependency>
 
 <dependency>
 <groupid>com.alibaba</groupid>
 <artifactid>fastjson</artifactid>
 <version>${fastjson.version}</version>
 </dependency>
 
 </dependencies>
 
 <!-- 使用aliyun鏡像 -->
 <repositories>
 <repository>
 <id>aliyun</id>
 <name>aliyun</name>
 <url>http://maven.aliyun.com/nexus/content/groups/public</url>
 </repository>
 </repositories>
 
 <build>
 <finalname>platform-springmvc-webapp</finalname>
 </build>
</project>

2、 配置web.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!doctype web-app public
 "-//sun microsystems, inc.//dtd web application 2.3//en"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
 
<web-app>
 <display-name>archetype created web application</display-name>
 <context-param>
 <param-name>contextconfiglocation</param-name>
 <param-value>classpath:conf/spring/spring-*.xml</param-value>
 </context-param>
 
 <listener>
 <description>spring監(jiān)聽器</description>
 <listener-class>org.springframework.web.context.contextloaderlistener</listener-class>
 </listener>
 
 <servlet>
 <servlet-name>spring-mvc</servlet-name>
 <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
 <init-param>
 <param-name>contextconfiglocation</param-name>
 <param-value>/web-inf/spring-servlet.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
 <servlet-name>spring-mvc</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>
 
 <filter>
 <filter-name>characterencodingfilter</filter-name>
 <filter-class>org.springframework.web.filter.characterencodingfilter</filter-class>
 <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>
 
 
 <welcome-file-list>
 <welcome-file>/index.jsp</welcome-file>
 </welcome-file-list>
 
 <error-page>
 <error-code>404</error-code>
 <location>/index.jsp</location>
 </error-page>
</web-app>

3、 配置spring-servlet.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?xml version="1.0" encoding="utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xsi:schemalocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.2.xsd">
 
 <context:component-scan base-package="com.mengdee.manage.controller" />
 
 <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver">
 <property name="prefix" value="/"></property> <!-- 視圖文件的前綴 -->
 <property name="suffix" value=".jsp"></property> <!-- 視圖文件的后綴名 -->
 <!-- view是用什么顯示,這里是jsp,還可以用velocity之類的 -->
 <property name="viewclass" value="org.springframework.web.servlet.view.jstlview"></property>
 </bean>
 
 <!-- 啟動spring mvc的注解功能,完成請求和注解pojo的映射 -->
 <mvc:annotation-driven>
 <mvc:message-converters register-defaults="true">
 <!-- 配置fastjson 替換原來的jackson支持 -->
 <bean class="com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter">
 <property name="supportedmediatypes">
 <list>
 <value>text/html;charset=utf-8</value>
 <value>application/json</value>
 </list>
 </property>
 <property name="features">
 <list>
 
 <value>quotefieldnames</value> <!-- 輸出key時是否使用雙引號,默認(rèn)為true -->
 <value>writemapnullvalue</value> <!-- 是否輸出值為null的字段,默認(rèn)為false -->
 
 <!--
 <value>disablecircularreferencedetect</value>
 <value>writedateusedateformat</value>
 <value>writenullstringasempty</value> 字符類型字段如果為null,輸出為"",而非null
 <value>writenullnumberaszero</value> 數(shù)值字段如果為null,輸出為0,而非null
 <value>writenullbooleanasfalse</value> boolean字段如果為null,輸出為false,而非null
 <value>writenulllistasempty</value> list字段如果為null,輸出為[],而非null
 -->
 
 </list>
 </property>
 </bean>
 </mvc:message-converters>
 </mvc:annotation-driven>
</beans>

4、java

education:學(xué)歷(枚舉類)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.mengdee.manage.entity;
import java.util.hashmap;
import java.util.map;
/**
 * 學(xué)歷
 * @author administrator
 *
 */
public enum education {
 kindergarten("幼兒園", 1),
 elementary("小學(xué)", 2),
 junior_middle("初級中學(xué)", 3),
 senior_middle("高級中學(xué)", 4),
 university("大學(xué)", 5),
 college("學(xué)院", 6);
 private static final map<integer, education> education_map = new hashmap<integer, education>();
 static {
 for (education education : education.values()) {
 education_map.put(education.getindex(), education);
 }
 }
 
 private string text;
 private int index;
 
 private education(string text, int index) {
 this.text = text;
 this.index = index;
 }
 
 
 public string gettext() {
 return text;
 }
 
 public void settext(string text) {
 this.text = text;
 }
 
 public int getindex() {
 return index;
 }
 
 public void setindex(int index) {
 this.index = index;
 }
 
 
 public static education getenum(integer index) {
 return education_map.get(index);
 }
}

person:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.mengdee.manage.entity;
import java.util.arraylist;
import java.util.date;
import java.util.list;
import java.util.map;
import com.alibaba.fastjson.annotation.jsonfield;
public class person {
 
 private long id;
 private string name;
 
 private byte gender; // 性別 1:男 2:女
 private short age; // 年齡
 private long salary; // 薪水
 private double weight; // 體重
 private char level; // 評級
 
 private boolean adult; // 是否成年人
 private date birthday; // 生日
 private education education;// 學(xué)歷
 
 private string[] hobbies; // 愛好
 private list<dog> dogs; // 寵物狗
 private map<string, object> address; // 住址
 
 // 使用注解控制是否要序列化
 @jsonfield(serialize = false)
 private list<object> obj = new arraylist<>();
 
 public person() {
 
 }
 public person(long id, string name, byte gender, short age, long salary, double weight, char level, boolean adult,
 date birthday, string[] hobbies, list<dog> dogs, map<string, object> address) {
 super();
 this.id = id;
 this.name = name;
 this.gender = gender;
 this.age = age;
 this.salary = salary;
 this.weight = weight;
 this.level = level;
 this.adult = adult;
 this.birthday = birthday;
 this.hobbies = hobbies;
 this.dogs = dogs;
 this.address = address;
 }
 
 
 public long getid() {
 return id;
 }
 public void setid(long id) {
 this.id = id;
 }
 public string getname() {
 return name;
 }
 public void setname(string name) {
 this.name = name;
 }
 public byte getgender() {
 return gender;
 }
 public void setgender(byte gender) {
 this.gender = gender;
 }
 public short getage() {
 return age;
 }
 public void setage(short age) {
 this.age = age;
 }
 public long getsalary() {
 return salary;
 }
 public void setsalary(long salary) {
 this.salary = salary;
 }
 public double getweight() {
 return weight;
 }
 public void setweight(double weight) {
 this.weight = weight;
 }
 public char getlevel() {
 return level;
 }
 public void setlevel(char level) {
 this.level = level;
 }
 public boolean isadult() {
 return adult;
 }
 public void setadult(boolean adult) {
 this.adult = adult;
 }
 public date getbirthday() {
 return birthday;
 }
 public void setbirthday(date birthday) {
 this.birthday = birthday;
 }
 
 // 處理序列化枚舉類型,默認(rèn)的值是序列化枚舉值字符串,而不是枚舉綁定的索引或者文本
 @jsonfield(name = "edu")
 public int getedu(){
 return education.getindex();
 }
 
 @jsonfield(name = "edu")
 public void setedu(int index){
 this.education = education.getenum(index);
 }
 
 @jsonfield(serialize = false)
 public education geteducation() {
 return education;
 }
 
 @jsonfield(serialize = false)
 public void seteducation(education education) {
 this.education = education;
 }
 
 
 public string[] gethobbies() {
 return hobbies;
 }
 public void sethobbies(string[] hobbies) {
 this.hobbies = hobbies;
 }
 public list<dog> getdogs() {
 return dogs;
 }
 public void setdogs(list<dog> dogs) {
 this.dogs = dogs;
 }
 public map<string, object> getaddress() {
 return address;
 }
 public void setaddress(map<string, object> address) {
 this.address = address;
 }
}

testcontroller

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
package com.mengdee.manage.controller;
 
import java.text.decimalformat;
import java.util.arraylist;
import java.util.date;
import java.util.hashmap;
import java.util.list;
import java.util.map;
 
import org.springframework.stereotype.controller;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.responsebody;
 
import com.alibaba.fastjson.json;
import com.alibaba.fastjson.jsonarray;
import com.alibaba.fastjson.serializer.doubleserializer;
import com.alibaba.fastjson.serializer.serializeconfig;
import com.alibaba.fastjson.serializer.simpledateformatserializer;
import com.mengdee.manage.entity.address;
import com.mengdee.manage.entity.dog;
import com.mengdee.manage.entity.education;
import com.mengdee.manage.entity.person;
 
@controller
public class testcontroller {
 private static serializeconfig serializeconfig = new serializeconfig();
 static {
 serializeconfig.put(date.class, new simpledateformatserializer("yyyy-mm-dd hh:mm:ss"));
 serializeconfig.put(double.class, new doubleserializer(new decimalformat("0.00")));
 }
 
 
 @requestmapping("/index")
 public string index(){
 return "index";
 }
 
 
 // javabean to object
 @requestmapping("/json")
 @responsebody
 public object json(){
 person person = new person();
 person.setid(1l);
 person.setname("mengdee");
 person.setage((short) 18);
 
 //
 /*
 {
 "birthday": null,
 "weight": 0,
 "dogs": null,
 "adult": false,
 "hobbies": null,
 "education": null,
 "id": 1,
 "level": "",
 "address": null,
 "age": 18,
 "name": "mengdee",
 "gender": 0,
 "salary": 0
 }
 */
 object personjson = json.tojson(person);
 return personjson;
 }
 
 // javabean to string
 @requestmapping("/json2")
 @responsebody
 public string json2(){
 person person = new person();
 person.setid(1l);
 person.setname("mengdee");
 person.setage((short) 18);
 
 // 使用該方式值為null的經(jīng)測試不出來,已經(jīng)配置了<value>writemapnullvalue</value>
// "{"adult":false,"age":18,"gender":0,"id":1,"level":"","name":"mengdee","salary":0,"weight":0.0}"
 string jsonstring = json.tojsonstring(person);
 return jsonstring;
 }
 
 @requestmapping("/json3")
 @responsebody
 public object json3(){
 person person = new person();
 person.setid(1l);
 person.setname("mengdee");
 person.setage((short) 18);
 person.setbirthday(new date());
 
 object personjson = json.tojson(person); // json.tojson(person)默認(rèn)是毫秒數(shù)"birthday":1495073314780,
 
// 使用serializeconfig序列號配置對日期格式化
// "{"birthday":"2017-05-18 10:19:55","weight":0.0,"adult":false,"id":1,"level":"","age":18,"name":"mengdee","gender":0,"salary":0}"
 string jsonstring = json.tojsonstring(personjson, serializeconfig);
 return jsonstring;
 }
 
 
 @requestmapping("/json4")
 @responsebody
 public object json4(){
 person person = new person();
 person.setid(1l);
 person.setname("mengdee");
 person.setage((short) 18);
 person.setbirthday(new date());
 person.seteducation(education.university); // 枚舉
 
 string[] hobbies = {"讀書", "旅游"};
 person.sethobbies(hobbies);
 
 dog dog1 = new dog(1l, "dog1", (short)1);
 dog dog2 = new dog(2l, "dog2", (short)2);
 list<dog> dogs = new arraylist<>();
 dogs.add(dog1);
 dogs.add(dog2);
 person.setdogs(dogs);
 
 address address1 = new address(1l, "上海浦東新區(qū)");
 address address2 = new address(2l, "上海寶山區(qū)");
 map<string, object> addressmap = new hashmap<>();
 addressmap.put(address1.getid() + "", address1);
 addressmap.put(address2.getid() + "", address2);
 person.setaddress(addressmap);
 
 
 
 object personjson = json.tojson(person);
 
 return personjson;
 }
 
 @requestmapping("/json5")
 @responsebody
 public string json5(){
 dog dog1 = new dog(1l, "dog1", (short)1);
 dog dog2 = new dog(2l, "dog2", (short)2);
 list<dog> dogs = new arraylist<>();
 dogs.add(dog1);
 dogs.add(dog2);
 
 // list<t> -> json
 string jsonstring = json.tojsonstring(dogs, false);
 system.out.println(jsonstring);
 
 // json -> list<t>
 list<dog> parsearray = json.parsearray(jsonstring, dog.class);
 for (dog dog : parsearray) {
 system.out.println(dog);
 }
 
 map<string,dog> map = new hashmap<string, dog>();
 map.put("dog1",new dog(1l, "dog1", (short)1));
 map.put("dog2",new dog(2l, "dog2", (short)2));
 map.put("dog3",new dog(3l, "dog3", (short)3));
 
 // map -> json
 string mapjsonstring = json.tojsonstring(map,true);
 system.out.println(mapjsonstring);
 
 // json -> map
 @suppresswarnings("unchecked")
 map<string,dog> map1 = (map<string,dog>)json.parse(mapjsonstring);
 for (string key : map1.keyset()) {
 system.out.println(key + ":" + map1.get(key));
 }
 
 // array -> json
 string[] hobbies = {"a","b","c"};
 string hobbiesstring = json.tojsonstring(hobbies,true);
 system.out.println(hobbies);
 
 // json -> array
 jsonarray jsonarray = json.parsearray(hobbiesstring);
 for (object o : jsonarray) {
 system.out.println(o);
 }
 system.out.println(jsonarray);
 return jsonstring;
 }
}

swagger集成

第一步:引入相關(guān)依賴

?
1
2
3
4
5
6
7
8
9
10
11
<dependency>
 <groupid>io.springfox</groupid>
 <artifactid>springfox-swagger2</artifactid>
 <version>2.6.1</version>
 <scope>compile</scope>
</dependency>
<dependency>
 <groupid>com.fasterxml.jackson.core</groupid>
 <artifactid>jackson-databind</artifactid>
 <version>2.6.6</version>
</dependency>

第二步:swagger信息配置

swaggerconfig.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@configuration
@enablewebmvc
@enableswagger2
public class swaggerconfig {
 @bean
 public docket customdocket() {
 docket docket = new docket(documentationtype.swagger_2);
 docket.apiinfo(apiinfo());
 docket.select().apis(requesthandlerselectors.withmethodannotation(apioperation.class));
 docket.select().paths(pathselectors.regex("/api/.*")).build();
 
 return docket;
 }
 
 private apiinfo apiinfo() {
 contact contact = new contact("小明", "http://www.baidu.com", "[email protected]");
 return new apiinfo("api接口", //大標(biāo)題 title
 "api接口", //小標(biāo)題
 "0.0.1", //版本
 "www.baidu.com",//termsofserviceurl
 contact,//作者
 "api接口",//鏈接顯示文字
 "http://www.baidu.com"//網(wǎng)站鏈接
 );
 }
}

注意:因swaggerconfig這個類配置了注解,所以這個類必須被掃描到,即該類一定包含在context:component-scan中。

第三步:在類、方法、參數(shù)上使用注解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@controller
@requestmapping("/api/v1")
@api(description = "api接口")
public class apicontroller {
 @apioperation(value = "用戶登錄", notes = "用戶登錄接口")
 @apiresponses({
 @apiresponse(code = 0, message = "success"),
 @apiresponse(code = 10001, message = "用戶名錯誤", response = illegalargumentexception.class),
 @apiresponse(code = 10002, message = "密碼錯誤")
 })
 @requestmapping(value = "/user/login", method = requestmethod.post, produces = {"application/json;charset=utf-8;"})
 @responsebody
 public string login(@apiparam(name = "username", value = "用戶名", required = true) @requestparam string username,
  @apiparam(name = "password", value = "密碼", required = true) @requestparam string password){
 return "{'username':'" + username + "', 'password':'" + password + "'}";
 }
 
 
 @apiimplicitparams({
 @apiimplicitparam(paramtype = "header", name = "phone", datatype = "string", required = true, value = "手機(jī)號"),
 @apiimplicitparam(paramtype = "query", name = "nickname", datatype = "string", required = true, value = "nickname", defaultvalue = "雙擊666"),
 @apiimplicitparam(paramtype = "path", name = "platform", datatype = "string", required = true, value = "平臺", defaultvalue = "pc"),
 @apiimplicitparam(paramtype = "body", name = "password", datatype = "string", required = true, value = "密碼")
 })
 @requestmapping(value = "/{platform}/user/regist", method = requestmethod.post, produces = {"application/json;charset=utf-8;"})
 @responsebody
 public string regist(@requestheader string phone, @requestparam string nickname, @pathvariable string platform, @requestbody string password){
 return "{'username':'" + phone + "', 'nickname':'" + nickname + "', 'platform': '" + platform + "', 'password':'"+password+"'}";
 }
 
 @requestmapping(value = "/user/list", method = requestmethod.get, produces = {"application/json;charset=utf-8;"})
 @responsebody
 public string getuserlist(pager pager){
 return "[{'id': "+pager.getpage()+", 'username': 'zhangsan"+pager.getsize()+"'}]";
 }
 
 @requestmapping("/docs")
 @apiignore
 public string test(){
 return "api-docs";
 }
}

pager

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class pager {
 @apimodelproperty(value = "頁碼", required = true)
 private int page;
 @apimodelproperty(value = "每頁條數(shù)", required = true)
 private int size;
 
 public pager() {
 }
 
 public int getpage() {
 return page;
 }
 
 public void setpage(int page) {
 this.page = page;
 }
 
 public int getsize() {
 return size;
 }
 
 public void setsize(int size) {
 this.size = size;
 }
}

常用注解:

  • @api(description = “接口類的描述”)
  • @apioperation(value = “接口方法的名稱”, notes = “備注說明”)
  • @apiparam(name = “參數(shù)名稱”, value = “備注說明”, required = 是否必須):標(biāo)注在方法的參數(shù)上 用于描述參數(shù)的名稱、備注、是否必須等信息
  • @apiimplicitparam(paramtype = “query”, name = “password”, datatype = “string”, required = true, value = “密碼”, defaultvalue = “123456”)用于描述方法的參數(shù),標(biāo)注在方法上,和@apiparam功能一樣,只是標(biāo)注的位置不同而已
         .paramtype:參數(shù)類型,即參數(shù)放在哪個地方
                .   header–>請求參數(shù)的獲取:@requestheader,參數(shù)放在請求頭
                 .   query–>請求參數(shù)的獲取:@requestparam,參數(shù)追加在url后面
                 .   path(用于restful接口)–>請求參數(shù)的獲取:@pathvariable
                 .   body 使用@requestbody接收數(shù)據(jù) post有效,參數(shù)放在請求體中
                 .    form
        .name:參數(shù)名
        .datatype:參數(shù)的數(shù)據(jù)類型
        .required:參數(shù)是否必須傳
        .value:參數(shù)的描述
        .defaultvalue:參數(shù)的默認(rèn)值
  • @apiimplicitparams: 用于包含多個@apiimplicitparam
  • @apiresponse(code = 0, message = “success”),
         .code:響應(yīng)碼,例如400
         .message:信息,一般是對code的描述
         .response:拋出異常的類
  • @apimodel:描述一個model的信息(這種一般用在post創(chuàng)建的時候,使用@requestbody這樣的場景,請求參數(shù)無法使用@apiimplicitparam注解進(jìn)行描述的時候)
         .@apimodelproperty:描述一個model的屬性
                  .   position 允許在模型中顯式地排序?qū)傩浴?br />               .   value 參數(shù)名稱
                  .   required 是否必須 boolean
                  .   hidden 是否隱藏 boolean
                  .   allowablevalues = “range[0, 1]” 一般用于指定參數(shù)的合法值
  • @apiignore:用于或略該接口,不生成該接口的文檔

第四步:訪問/v2/api-docs

在瀏覽器上訪問http://localhost:8080/工程名稱/v2/api-docs 如果有json內(nèi)容,證明正常

Spring MVC+FastJson+Swagger集成的完整實例教程

第五步:下載swagger-ui

從github上下載https://github.com/swagger-api/swagger-ui,注意這里要選擇下載v2.2.10(https://github.com/swagger-api/swagger-ui/tree/v2.2.10 ),大于這個版本的集成方式不一樣。

集成方法:將v2.2.10下的dist目錄下的所有文件放到自己工程中靜態(tài)文件中,并使用下面代碼覆蓋掉index.html中的腳本部分

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<script type="text/javascript">
 var baseurl = "";
 $(function () {
  var url = window.location.search.match(/url=([^&]+)/);
  if (url && url.length > 1) {
  url = decodeuricomponent(url[1]);
  } else {
  //上面描述的api-docs地址
  url = baseurl + "/webapp/v2/api-docs";
  }
 
  // pre load translate...
  if (window.swaggertranslator) {
  window.swaggertranslator.translate();
  }
  window.swaggerui = new swaggerui({
  url: url,
  validatorurl: undefined,
  dom_id: "swagger-ui-container",
  supportedsubmitmethods: ['get', 'post', 'put', 'delete', 'patch'],
  oncomplete: function (swaggerapi, swaggerui) {
 
   if (typeof initoauth == "function") {
   initoauth({
    clientid: "your-client-id",
    clientsecret: "your-client-secret-if-required",
    realm: "your-realms",
    appname: "your-app-name",
    scopeseparator: ",",
    additionalquerystringparams: {}
   });
   }
 
   if (window.swaggertranslator) {
   window.swaggertranslator.translate();
   }
 
   $('pre code').each(function (i, e) {
   hljs.highlightblock(e)
   });
 
   addapikeyauthorization();
  },
  onfailure: function (data) {
   log("unable to load swaggerui");
  },
  docexpansion: "none",
  jsoneditor: false,
  apissorter: "alpha",
  defaultmodelrendering: 'schema',
  showrequestheaders: false
  });
 
  //這里可以添加權(quán)限認(rèn)證,例如token
  function addapikeyauthorization() {
  var token = "you-token";
  var tokenheader = new swaggerclient.apikeyauthorization("token", token, "header");
  window.swaggerui.api.clientauthorizations.add("token", tokenheader);
  }
 
  window.swaggerui.load();
  function log() {
  if ('console' in window) {
   console.log.apply(console, arguments);
  }
  }
 });
 </script>

第六步:訪問上面修改的那個index.html
http://localhost:8080/工程名稱/static/third-party/swagger-ui/index.html

注意:因要訪問靜態(tài)資源,使用springmvc請確保靜態(tài)資源能夠被訪問到,如果不能訪問請做如下配置:

1、 在spring的配置文件中增加默認(rèn)的servlet處理器

?
1
2
<!-- 過濾靜態(tài)資源 -->
<mvc:default-servlet-handler/>

2、 在web.xml中增加要過濾的靜態(tài)文件

?
1
2
3
4
5
6
7
8
<!-- 過濾靜態(tài)資源 -->
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.js</url-pattern>
 <url-pattern>*.css</url-pattern>
 <url-pattern>/assets/*"</url-pattern>
 <url-pattern>/images/*</url-pattern>
</servlet-mapping>

Spring MVC+FastJson+Swagger集成的完整實例教程

示例項目代碼結(jié)構(gòu):

Spring MVC+FastJson+Swagger集成的完整實例教程

完整示例demo下載地址:platform-springmvc-webapp.rar

其他

關(guān)于spring-servlet.xml 和 applicationcontext.xml

springmvc 提供了兩種配置文件 spring-servlet.xml 、 applicationcontext.xml
spring-servlet.xml 是controller級別的,作用范圍是控制層,默認(rèn)的名字是【servlet-name】-servlet.xml
默認(rèn)是放在web-inf/目錄下,springmvc會自動加載,也可以在web.xml中配置它的位置

?
1
2
3
4
5
6
7
8
9
<servlet>
 <servlet-name>spring-mvc</servlet-name>
 <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
 <init-param>
 <param-name>contextconfiglocation</param-name>
 <param-value>/web-inf/spring-servlet.xml</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
</servlet>

一般在spring-servlet.xml中配置一些和控制器相關(guān)的配置,如視圖解析、靜態(tài)資源文件的映射、返回結(jié)果的解析等

視圖解析

  • org.springframework.web.servlet.view.urlbasedviewresolver
  • tiles3: org.springframework.web.servlet.view.tiles3.tilesconfigurer
  • springmvc: org.springframework.web.servlet.view.internalresourceviewresolver,
  • shiro: org.apache.shiro.spring.security.interceptor.authorizationattributesourceadvisor
  • 上傳 org.springframework.web.multipart.commons.commonsmultipartresolver,

靜態(tài)資源映射

?
1
2
3
4
5
6
<mvc:resources location="/static/" mapping="/static/**" />
<mvc:resources location="/images/" mapping="/static/**" />
<mvc:resources location="/css/" mapping="/static/**" />
<mvc:resources location="/js/" mapping="/static/**" />
<mvc:resources location="/html/" mapping="/static/**" />
<mvc:resources location="/upload/" mapping="/static/**" />

org.springframework.context.support.resourcebundlemessagesource

返回結(jié)果的解析

  • fastjson: com.alibaba.fastjson.support.spring.fastjsonhttpmessageconverter

3、applicationcontext.xml 是系統(tǒng)級別的配置,作用范圍是系統(tǒng)上下文,它的初始化需要放到 web.xml 中的context-param中配置

?
1
2
3
4
<context-param>
 <param-name>contextconfiglocation</param-name>
 <param-value>classpath:conf/spring/spring-*.xml</param-value>
</context-param>

4、 關(guān)于applicationcontxt.xml,一般是按照功能拆成多個配置文件如:

  • - applicationcontxt-base.xml // 基礎(chǔ)
  • - applicationcontxt-redis.xml // redis相關(guān)配置
  • - applicationcontxt-shiro.xml // shiro 相關(guān)配置
  • - applicationcontxt-dao.xml // 數(shù)據(jù)庫相關(guān)配置
  • - applicationcontxt-xxx.xml // xxx

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://blog.csdn.net/vbirdbest/article/details/72472149

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 爆操俄罗斯美女 | 香蕉精品国产高清自在自线 | 91免费精品国自产拍在线不卡 | 天天黄视频 | 久久免费国产视频 | 满溢游泳池免费土豪全集下拉版 | 500第一精品 | re99| 亚洲一区二区三区久久精品 | 无敌秦墨漫画免费阅读 | 美女扒开腿让男人桶爽免费gif | 国产精品成人扳一级aa毛片 | 国产精彩对白综合视频 | 久久精品中文字幕 | 国产麻豆91欧美一区二区 | 999jjj在线播放 | 久久一er精这里有精品 | 成人中文字幕在线高清 | 奇米影视77777| 国产xxxxxx久色视频在 | 国产3344视频在线观看免费 | 国产小青蛙 | 国产一区日韩二区欧美三区 | 精品国产乱码久久久久久人妻 | 青青成人在线 | 动漫美女胸被狂揉扒开吃奶动态图 | 果冻传媒在线播放1 | 欧美人做人爱a全程免费 | 久久久免费观成人影院 | 精品国产日韩亚洲一区在线 | 免费的强动漫人物 | 视频亚洲一区 | 国产高清路线一路线二2022 | 国产自在自线午夜精品之la | 91.prom在线观看国产 | 欧美一级片免费 | 精品推荐国产麻豆剧传媒 | 无人在线视频高清免费播放 | 色综合久久天天综合 | 成年性生交大片免费看 | 亚洲婷婷在线视频 |