Spring统一返回Json工具类,带分页信息

前言:

  • 项目做前后端分离时,我们会经常提供Json数据给前端,如果有一个统一的Json格式返回工具类,那么将大大提高开发效率和减低沟通成本。

  • 此Json响应工具类,支持带分页信息,支持泛型,支持HttpStatus标准返回码

效果预览:

步入正题:

1. Resp工具类
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
import java.io.Serializable;
import java.util.Map;

/**
* @Author: XiongFeng
* @Description: Restful统一Json响应对象封装
* @Date: Created in 9:39 2018/4/10
*/
public class Resp<T> implements Serializable {
private static final long serialVersionUID = 1L;

private final static String SUCCESS_CODE = "200";

/**
* 返回状态码
*/
private String status;

/**
* 返回消息
*/
private String message;

/**
* 返回内容
*/
private T data;

/**
* 分页信息
*/
private PageInfo page;

/**
* 其他内容
*/
private Map<String, Object> ext;

public String getStatus() {
return status;
}

public void setStatus(String status) {
this.status = status;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public T getData() {
return data;
}

public void setData(T data) {
this.data = data;
}

public Map<String, Object> getExt() {
return ext;
}

public void setExt(Map<String, Object> ext) {
this.ext = ext;
}

public PageInfo getPage() {
return page;
}

public void setPage(PageInfo page) {
this.page = page;
}

public Resp(){
this.status = SUCCESS_CODE;
this.message = "SUCCESS";
}

public Resp(String status, String message) {
this.status = status;
this.message = message;
}

public Resp(String status, String message, T data) {
this.status = status;
this.message = message;
this.data = data;
}

public Resp(String status, String message, T data, Map<String, Object> ext) {
this.status = status;
this.message = message;
this.data = data;
this.ext = ext;
}

public Resp(String status, String message, T data, PageInfo pageInfo) {
this.status = status;
this.message = message;
this.data = data;
this.page = pageInfo;
}

public Resp(String status, String message, T data, Map<String, Object> ext, PageInfo pageInfo) {
this.status = status;
this.message = message;
this.data = data;
this.ext = ext;
this.page = pageInfo;
}

public Resp(String status, String message, T data, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
this.status = status;
this.message = message;
this.data = data;
this.page = pageInfo;
}

public Resp(String status, String message, T data, Map<String, Object> ext, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
this.status = status;
this.message = message;
this.data = data;
this.ext = ext;
this.page = pageInfo;
}

//快速返回成功
public static <T>Resp success(){
return new Resp<T>(SUCCESS_CODE,"请求成功",null);
}

public static <T>Resp success(T result){
return new Resp<T>(SUCCESS_CODE,"请求成功",result);
}

public static <T>Resp success(String message, T result){
return new Resp<T>(SUCCESS_CODE,message,result);
}

public static <T>Resp success(String message, T result, Map<String, Object> extra){
return new Resp<T>(SUCCESS_CODE,message,result, extra);
}

public static <T>Resp success(T result, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(SUCCESS_CODE,"请求成功",result, pageInfo);
}

public static <T>Resp success(T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(SUCCESS_CODE,"请求成功",result, extra,pageInfo);
}

public static <T>Resp success(String message, T result, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(SUCCESS_CODE,message,result,pageInfo);
}

public static <T>Resp success(String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(SUCCESS_CODE,message,result, extra,pageInfo);
}

//快速返回失败状态
public static <T>Resp fail(){
return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),ErrorCode.SYSTEM_ERROR.getMessage());
}

public static <T>Resp fail(T result){
return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),ErrorCode.SYSTEM_ERROR.getMessage(),result);
}

public <T>Resp fail(String message, T result){
return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),message,result);
}

public <T>Resp fail(String message, T result, Map<String, Object> extra){
return new Resp<T>(ErrorCode.SYSTEM_ERROR.getCode(),message,result, extra);
}

public static <T>Resp fail(ErrorCode errorCode){
return new Resp<T>(errorCode.getCode(),errorCode.getMessage());
}

public static <T>Resp fail(ErrorCode errorCode, T result){
return new Resp<T>(errorCode.getCode(),errorCode.getMessage(),result);
}

public static <T>Resp fail(ErrorCode errorCode, String message, T result){
return new Resp<T>(errorCode.getCode(),message,result);
}

public static <T>Resp fail(ErrorCode errorCode, String message, T result, Map<String, Object> extra){
return new Resp<T>(errorCode.getCode(),message,result, extra);
}

//快速返回自定义状态码
public static <T>Resp result(String statusCode, String message){
return new Resp<T>(statusCode,message);
}

public static <T>Resp result(String statusCode, String message, T result){
return new Resp<T>(statusCode,message,result);
}

public static <T>Resp result(String statusCode, String message, T result, Map<String, Object> extra){
return new Resp<T>(statusCode,message,result, extra);
}

public static <T>Resp result(String statusCode, String message, T result, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(statusCode,message,result, pageInfo);
}

public static <T>Resp result(String statusCode, String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return new Resp<T>(statusCode,message,result, extra,pageInfo);
}

//快速返回Http状态
public static <T>Resp httpStatus(HttpStatus httpStatus, String message){
return result(httpStatus.toString(),message);
}

public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result){
return result(httpStatus.toString(),message,result);
}

public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Map<String, Object> extra){
return result(httpStatus.toString(),message,result, extra);
}

public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return result(httpStatus.toString(),message,result, total, pageNo, pageSize);
}

public static <T>Resp httpStatus(HttpStatus httpStatus, String message, T result, Map<String, Object> extra, Long total, Integer pageNo, Integer pageSize){
PageInfo pageInfo = new PageInfo(total, pageNo, pageSize);
return result(httpStatus.toString(),message,result, extra, total, pageNo, pageSize);
}
}
2. PageInfo 用于封装分页信息的
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
import java.io.Serializable;

/**
* @Author: XiongFeng
* @Description: 分页信息
* @Date: Created in 9:39 2018/4/10
*/
public class PageInfo implements Serializable{


private static final long serialVersionUID = 1L;
/**
* 总记录数
*/
private Long total;
/**
* 总页数
*/
private Long totalPages;
/**
* 当前页
*/
private Integer pageNo;
/**
* 页记录数
*/
private Integer pageSize;

public PageInfo(Long total) {
this.total = total;
}

public PageInfo(Long total, Integer pageNo,
Integer pageSize) {
this.total = total;
this.totalPages = (total - 1) / pageSize + 1;
this.pageNo = pageNo;
this.pageSize = pageSize;
}

public static PageInfo page(Long total) {
return new PageInfo(total);
}

public static PageInfo page( Long total, Integer pageNo,
Integer pageSize) {
return new PageInfo(total, pageNo, pageSize);
}

public Long getTotal() {
return total;
}

public void setTotal(Long total) {
this.total = total;
}

public Long getTotalPages() {
return totalPages;
}

public void setTotalPages(Long totalPages) {
this.totalPages = totalPages;
}

public Integer getPageNo() {
return pageNo;
}

public void setPageNo(Integer pageNo) {
this.pageNo = pageNo;
}

public Integer getPageSize() {
return pageSize;
}

public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
}
4. ErrorCode 用于定义错误码
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
/**
* @Author: XiongFeng
* @Description: 错误码
* @Date: Created in 9:39 2018/4/10
*/
public enum ErrorCode {

SYSTEM_ERROR(500, "系统错误"),
PARAMETER_CHECK_ERROR(400, "参数校验错误"),
AUTH_VALID_ERROR(701, "用户权限不足"),
UNLOGIN_ERROR(401, "用户未登录或登录状态超时失效"),
;

private final Integer value;
private final String message;

ErrorCode(int value, String message) {
this.value = value;
this.message = message;
}

public int getValue() {
return value;
}

public String getMessage() {
return message;
}

@Override
public String toString() {
return value.toString();
}

public String getCode() {
return value.toString();
}

public static ErrorCode getByCode(Integer value) {
for (ErrorCode _enum : values()) {
if (_enum.getValue() == value) {
return _enum;
}
}
return null;
}

}
5. HttpStatus 提取自org.springframework.http,可以自己引入
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
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
/**
* Enumeration of HTTP status codes.
*
* <p>The HTTP status code series can be retrieved via {@link #series()}.
*
* @author Arjen Poutsma
* @author Sebastien Deleuze
* @author Brian Clozel
* @since 3.0
* @see HttpStatus.Series
* @see <a href="http://www.iana.org/assignments/http-status-codes">HTTP Status Code Registry</a>
* @see <a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes">List of HTTP status codes - Wikipedia</a>
*/
public enum HttpStatus {

// 1xx Informational

/**
* {@code 100 Continue}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.1">HTTP/1.1: Semantics and Content, section 6.2.1</a>
*/
CONTINUE(100, "Continue"),
/**
* {@code 101 Switching Protocols}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.2.2">HTTP/1.1: Semantics and Content, section 6.2.2</a>
*/
SWITCHING_PROTOCOLS(101, "Switching Protocols"),
/**
* {@code 102 Processing}.
* @see <a href="http://tools.ietf.org/html/rfc2518#section-10.1">WebDAV</a>
*/
PROCESSING(102, "Processing"),
/**
* {@code 103 Checkpoint}.
* @see <a href="http://code.google.com/p/gears/wiki/ResumableHttpRequestsProposal">A proposal for supporting
* resumable POST/PUT HTTP requests in HTTP/1.0</a>
*/
CHECKPOINT(103, "Checkpoint"),

// 2xx Success

/**
* {@code 200 OK}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.1">HTTP/1.1: Semantics and Content, section 6.3.1</a>
*/
OK(200, "OK"),
/**
* {@code 201 Created}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.2">HTTP/1.1: Semantics and Content, section 6.3.2</a>
*/
CREATED(201, "Created"),
/**
* {@code 202 Accepted}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.3">HTTP/1.1: Semantics and Content, section 6.3.3</a>
*/
ACCEPTED(202, "Accepted"),
/**
* {@code 203 Non-Authoritative Information}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.4">HTTP/1.1: Semantics and Content, section 6.3.4</a>
*/
NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
/**
* {@code 204 No Content}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.5">HTTP/1.1: Semantics and Content, section 6.3.5</a>
*/
NO_CONTENT(204, "No Content"),
/**
* {@code 205 Reset Content}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.3.6">HTTP/1.1: Semantics and Content, section 6.3.6</a>
*/
RESET_CONTENT(205, "Reset Content"),
/**
* {@code 206 Partial Content}.
* @see <a href="http://tools.ietf.org/html/rfc7233#section-4.1">HTTP/1.1: Range Requests, section 4.1</a>
*/
PARTIAL_CONTENT(206, "Partial Content"),
/**
* {@code 207 Multi-Status}.
* @see <a href="http://tools.ietf.org/html/rfc4918#section-13">WebDAV</a>
*/
MULTI_STATUS(207, "Multi-Status"),
/**
* {@code 208 Already Reported}.
* @see <a href="http://tools.ietf.org/html/rfc5842#section-7.1">WebDAV Binding Extensions</a>
*/
ALREADY_REPORTED(208, "Already Reported"),
/**
* {@code 226 IM Used}.
* @see <a href="http://tools.ietf.org/html/rfc3229#section-10.4.1">Delta encoding in HTTP</a>
*/
IM_USED(226, "IM Used"),

// 3xx Redirection

/**
* {@code 300 Multiple Choices}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.1">HTTP/1.1: Semantics and Content, section 6.4.1</a>
*/
MULTIPLE_CHOICES(300, "Multiple Choices"),
/**
* {@code 301 Moved Permanently}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.2">HTTP/1.1: Semantics and Content, section 6.4.2</a>
*/
MOVED_PERMANENTLY(301, "Moved Permanently"),
/**
* {@code 302 Found}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.3">HTTP/1.1: Semantics and Content, section 6.4.3</a>
*/
FOUND(302, "Found"),
/**
* {@code 302 Moved Temporarily}.
* @see <a href="http://tools.ietf.org/html/rfc1945#section-9.3">HTTP/1.0, section 9.3</a>
* @deprecated in favor of {@link #FOUND} which will be returned from {@code HttpStatus.valueOf(302)}
*/
@Deprecated
MOVED_TEMPORARILY(302, "Moved Temporarily"),
/**
* {@code 303 See Other}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.4">HTTP/1.1: Semantics and Content, section 6.4.4</a>
*/
SEE_OTHER(303, "See Other"),
/**
* {@code 304 Not Modified}.
* @see <a href="http://tools.ietf.org/html/rfc7232#section-4.1">HTTP/1.1: Conditional Requests, section 4.1</a>
*/
NOT_MODIFIED(304, "Not Modified"),
/**
* {@code 305 Use Proxy}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.5">HTTP/1.1: Semantics and Content, section 6.4.5</a>
* @deprecated due to security concerns regarding in-band configuration of a proxy
*/
@Deprecated
USE_PROXY(305, "Use Proxy"),
/**
* {@code 307 Temporary Redirect}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.4.7">HTTP/1.1: Semantics and Content, section 6.4.7</a>
*/
TEMPORARY_REDIRECT(307, "Temporary Redirect"),
/**
* {@code 308 Permanent Redirect}.
* @see <a href="http://tools.ietf.org/html/rfc7238">RFC 7238</a>
*/
PERMANENT_REDIRECT(308, "Permanent Redirect"),

// --- 4xx Client Error ---

/**
* {@code 400 Bad Request}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.1">HTTP/1.1: Semantics and Content, section 6.5.1</a>
*/
BAD_REQUEST(400, "Bad Request"),
/**
* {@code 401 Unauthorized}.
* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.1">HTTP/1.1: Authentication, section 3.1</a>
*/
UNAUTHORIZED(401, "Unauthorized"),
/**
* {@code 402 Payment Required}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.2">HTTP/1.1: Semantics and Content, section 6.5.2</a>
*/
PAYMENT_REQUIRED(402, "Payment Required"),
/**
* {@code 403 Forbidden}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.3">HTTP/1.1: Semantics and Content, section 6.5.3</a>
*/
FORBIDDEN(403, "Forbidden"),
/**
* {@code 404 Not Found}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.4">HTTP/1.1: Semantics and Content, section 6.5.4</a>
*/
NOT_FOUND(404, "Not Found"),
/**
* {@code 405 Method Not Allowed}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.5">HTTP/1.1: Semantics and Content, section 6.5.5</a>
*/
METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
/**
* {@code 406 Not Acceptable}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.6">HTTP/1.1: Semantics and Content, section 6.5.6</a>
*/
NOT_ACCEPTABLE(406, "Not Acceptable"),
/**
* {@code 407 Proxy Authentication Required}.
* @see <a href="http://tools.ietf.org/html/rfc7235#section-3.2">HTTP/1.1: Authentication, section 3.2</a>
*/
PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
/**
* {@code 408 Request Timeout}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.7">HTTP/1.1: Semantics and Content, section 6.5.7</a>
*/
REQUEST_TIMEOUT(408, "Request Timeout"),
/**
* {@code 409 Conflict}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.8">HTTP/1.1: Semantics and Content, section 6.5.8</a>
*/
CONFLICT(409, "Conflict"),
/**
* {@code 410 Gone}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.9">HTTP/1.1: Semantics and Content, section 6.5.9</a>
*/
GONE(410, "Gone"),
/**
* {@code 411 Length Required}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.10">HTTP/1.1: Semantics and Content, section 6.5.10</a>
*/
LENGTH_REQUIRED(411, "Length Required"),
/**
* {@code 412 Precondition failed}.
* @see <a href="http://tools.ietf.org/html/rfc7232#section-4.2">HTTP/1.1: Conditional Requests, section 4.2</a>
*/
PRECONDITION_FAILED(412, "Precondition Failed"),
/**
* {@code 413 Payload Too Large}.
* @since 4.1
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.11">HTTP/1.1: Semantics and Content, section 6.5.11</a>
*/
PAYLOAD_TOO_LARGE(413, "Payload Too Large"),
/**
* {@code 413 Request Entity Too Large}.
* @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.14">HTTP/1.1, section 10.4.14</a>
* @deprecated in favor of {@link #PAYLOAD_TOO_LARGE} which will be returned from {@code HttpStatus.valueOf(413)}
*/
@Deprecated
REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"),
/**
* {@code 414 URI Too Long}.
* @since 4.1
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.12">HTTP/1.1: Semantics and Content, section 6.5.12</a>
*/
URI_TOO_LONG(414, "URI Too Long"),
/**
* {@code 414 Request-URI Too Long}.
* @see <a href="http://tools.ietf.org/html/rfc2616#section-10.4.15">HTTP/1.1, section 10.4.15</a>
* @deprecated in favor of {@link #URI_TOO_LONG} which will be returned from {@code HttpStatus.valueOf(414)}
*/
@Deprecated
REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"),
/**
* {@code 415 Unsupported Media Type}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.13">HTTP/1.1: Semantics and Content, section 6.5.13</a>
*/
UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
/**
* {@code 416 Requested Range Not Satisfiable}.
* @see <a href="http://tools.ietf.org/html/rfc7233#section-4.4">HTTP/1.1: Range Requests, section 4.4</a>
*/
REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested range not satisfiable"),
/**
* {@code 417 Expectation Failed}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.5.14">HTTP/1.1: Semantics and Content, section 6.5.14</a>
*/
EXPECTATION_FAILED(417, "Expectation Failed"),
/**
* {@code 418 I'm a teapot}.
* @see <a href="http://tools.ietf.org/html/rfc2324#section-2.3.2">HTCPCP/1.0</a>
*/
I_AM_A_TEAPOT(418, "I'm a teapot"),
/**
* @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
*/
@Deprecated
INSUFFICIENT_SPACE_ON_RESOURCE(419, "Insufficient Space On Resource"),
/**
* @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
*/
@Deprecated
METHOD_FAILURE(420, "Method Failure"),
/**
* @deprecated See <a href="http://tools.ietf.org/rfcdiff?difftype=--hwdiff&url2=draft-ietf-webdav-protocol-06.txt">WebDAV Draft Changes</a>
*/
@Deprecated
DESTINATION_LOCKED(421, "Destination Locked"),
/**
* {@code 422 Unprocessable Entity}.
* @see <a href="http://tools.ietf.org/html/rfc4918#section-11.2">WebDAV</a>
*/
UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
/**
* {@code 423 Locked}.
* @see <a href="http://tools.ietf.org/html/rfc4918#section-11.3">WebDAV</a>
*/
LOCKED(423, "Locked"),
/**
* {@code 424 Failed Dependency}.
* @see <a href="http://tools.ietf.org/html/rfc4918#section-11.4">WebDAV</a>
*/
FAILED_DEPENDENCY(424, "Failed Dependency"),
/**
* {@code 426 Upgrade Required}.
* @see <a href="http://tools.ietf.org/html/rfc2817#section-6">Upgrading to TLS Within HTTP/1.1</a>
*/
UPGRADE_REQUIRED(426, "Upgrade Required"),
/**
* {@code 428 Precondition Required}.
* @see <a href="http://tools.ietf.org/html/rfc6585#section-3">Additional HTTP Status Codes</a>
*/
PRECONDITION_REQUIRED(428, "Precondition Required"),
/**
* {@code 429 Too Many Requests}.
* @see <a href="http://tools.ietf.org/html/rfc6585#section-4">Additional HTTP Status Codes</a>
*/
TOO_MANY_REQUESTS(429, "Too Many Requests"),
/**
* {@code 431 Request Header Fields Too Large}.
* @see <a href="http://tools.ietf.org/html/rfc6585#section-5">Additional HTTP Status Codes</a>
*/
REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
/**
* {@code 451 Unavailable For Legal Reasons}.
* @see <a href="https://tools.ietf.org/html/draft-ietf-httpbis-legally-restricted-status-04">
* An HTTP Status Code to Report Legal Obstacles</a>
* @since 4.3
*/
UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),

// --- 5xx Server Error ---

/**
* {@code 500 Internal Server Error}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.1">HTTP/1.1: Semantics and Content, section 6.6.1</a>
*/
INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
/**
* {@code 501 Not Implemented}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.2">HTTP/1.1: Semantics and Content, section 6.6.2</a>
*/
NOT_IMPLEMENTED(501, "Not Implemented"),
/**
* {@code 502 Bad Gateway}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.3">HTTP/1.1: Semantics and Content, section 6.6.3</a>
*/
BAD_GATEWAY(502, "Bad Gateway"),
/**
* {@code 503 Service Unavailable}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.4">HTTP/1.1: Semantics and Content, section 6.6.4</a>
*/
SERVICE_UNAVAILABLE(503, "Service Unavailable"),
/**
* {@code 504 Gateway Timeout}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.5">HTTP/1.1: Semantics and Content, section 6.6.5</a>
*/
GATEWAY_TIMEOUT(504, "Gateway Timeout"),
/**
* {@code 505 HTTP Version Not Supported}.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-6.6.6">HTTP/1.1: Semantics and Content, section 6.6.6</a>
*/
HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version not supported"),
/**
* {@code 506 Variant Also Negotiates}
* @see <a href="http://tools.ietf.org/html/rfc2295#section-8.1">Transparent Content Negotiation</a>
*/
VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
/**
* {@code 507 Insufficient Storage}
* @see <a href="http://tools.ietf.org/html/rfc4918#section-11.5">WebDAV</a>
*/
INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
/**
* {@code 508 Loop Detected}
* @see <a href="http://tools.ietf.org/html/rfc5842#section-7.2">WebDAV Binding Extensions</a>
*/
LOOP_DETECTED(508, "Loop Detected"),
/**
* {@code 509 Bandwidth Limit Exceeded}
*/
BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"),
/**
* {@code 510 Not Extended}
* @see <a href="http://tools.ietf.org/html/rfc2774#section-7">HTTP Extension Framework</a>
*/
NOT_EXTENDED(510, "Not Extended"),
/**
* {@code 511 Network Authentication Required}.
* @see <a href="http://tools.ietf.org/html/rfc6585#section-6">Additional HTTP Status Codes</a>
*/
NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required");


private final int value;

private final String reasonPhrase;


HttpStatus(int value, String reasonPhrase) {
this.value = value;
this.reasonPhrase = reasonPhrase;
}


/**
* Return the integer value of this status code.
*/
public int value() {
return this.value;
}

/**
* Return the reason phrase of this status code.
*/
public String getReasonPhrase() {
return this.reasonPhrase;
}

/**
* Whether this status code is in the HTTP series
* {@link org.springframework.http.HttpStatus.Series#INFORMATIONAL}.
* This is a shortcut for checking the value of {@link #series()}.
*/
public boolean is1xxInformational() {
return Series.INFORMATIONAL.equals(series());
}

/**
* Whether this status code is in the HTTP series
* {@link org.springframework.http.HttpStatus.Series#SUCCESSFUL}.
* This is a shortcut for checking the value of {@link #series()}.
*/
public boolean is2xxSuccessful() {
return Series.SUCCESSFUL.equals(series());
}

/**
* Whether this status code is in the HTTP series
* {@link org.springframework.http.HttpStatus.Series#REDIRECTION}.
* This is a shortcut for checking the value of {@link #series()}.
*/
public boolean is3xxRedirection() {
return Series.REDIRECTION.equals(series());
}


/**
* Whether this status code is in the HTTP series
* {@link org.springframework.http.HttpStatus.Series#CLIENT_ERROR}.
* This is a shortcut for checking the value of {@link #series()}.
*/
public boolean is4xxClientError() {
return Series.CLIENT_ERROR.equals(series());
}

/**
* Whether this status code is in the HTTP series
* {@link org.springframework.http.HttpStatus.Series#SERVER_ERROR}.
* This is a shortcut for checking the value of {@link #series()}.
*/
public boolean is5xxServerError() {
return Series.SERVER_ERROR.equals(series());
}

/**
* Returns the HTTP status series of this status code.
* @see HttpStatus.Series
*/
public Series series() {
return Series.valueOf(this);
}

/**
* Return a string representation of this status code.
*/
@Override
public String toString() {
return Integer.toString(this.value);
}


/**
* Return the enum constant of this type with the specified numeric value.
* @param statusCode the numeric value of the enum to be returned
* @return the enum constant with the specified numeric value
* @throws IllegalArgumentException if this enum has no constant for the specified numeric value
*/
public static HttpStatus valueOf(int statusCode) {
for (HttpStatus status : values()) {
if (status.value == statusCode) {
return status;
}
}
throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");
}


/**
* Enumeration of HTTP status series.
* <p>Retrievable via {@link HttpStatus#series()}.
*/
public enum Series {

INFORMATIONAL(1),
SUCCESSFUL(2),
REDIRECTION(3),
CLIENT_ERROR(4),
SERVER_ERROR(5);

private final int value;

Series(int value) {
this.value = value;
}

/**
* Return the integer value of this status series. Ranges from 1 to 5.
*/
public int value() {
return this.value;
}

public static Series valueOf(int status) {
int seriesCode = status / 100;
for (Series series : values()) {
if (series.value == seriesCode) {
return series;
}
}
throw new IllegalArgumentException("No matching constant for [" + status + "]");
}

public static Series valueOf(HttpStatus status) {
return valueOf(status.value);
}
}

}
6. 测试示例:
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

@ResponseBody
@RequestMapping("/json")
public Resp json(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
return Resp.success(member, 5L, 1, 3); //这里分页信息,请自己从PageHelper返回的数据中得到。参看下面注释内容:

//Page<Object> page = PageHelper.startPage(1, 5);
//MemberDetails member = memberService.getMemberDetailsByToken(token);
//return Resp.success(member, page.getTotal(), page.getPageNum(), page.getPageSize());
}

@ResponseBody
@RequestMapping("/json2")
public Resp json2(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
Map<String, Object> ext = new HashMap<>();
ext.put("msg", "扩展内容");
return Resp.success("成功了", member, ext, 5L, 1, 3);
}

@ResponseBody
@RequestMapping("/json3")
public Resp json3(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
return Resp.fail();
}

@ResponseBody
@RequestMapping("/json4")
public Resp json4(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
Map<String, Object> ext = new HashMap<>();
ext.put("msg", "扩展内容");
return Resp.result("201", "成功了", member);
}

@ResponseBody
@RequestMapping("/json5")
public Resp json5(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
return Resp.success(member);
}

@ResponseBody
@RequestMapping("/json6")
public Resp json6(String token) {
MemberDetails member = memberService.getMemberDetailsByToken(token);
return Resp.httpStatus(HttpStatus.ACCEPTED, "成功了");
}
7. 运行结果:

更多用法,请查看Resp类里面的静态方法

后记:

  • 如果大家有更好的改进建议或代码,欢迎在评论留言反馈,谢谢!