在開發過程中,有時候會需要使用錯誤碼+錯誤信息的形式,來返回某些業務操作的錯誤結果信息,來代替效率較低的異常傳遞。
這樣就需要封裝一個統一的Result model作為返回值,代替直接返回數據等結果。
1.定義錯誤碼 - 錯誤信息接口
錯誤碼可能是String、Integer、Long 等類型,也可能是enum類型。因此這里使用泛型來代替,錯誤碼類型,可以提高靈活性
。也可以通過枚舉直接實現CodeMessage接口。
1
2
3
4
|
public interface CodeMessage<C>{ C getCode(); String getMessage(); } |
2.實現Result Model
這里定義的是service層的Result。有時候在controller層只會作一些簡單的參數校驗,在service層會作進一步的校驗,
如果controller中需要統一返回一個JsonResult可以將ServiceResult作一個簡單的轉換器進行轉換。
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
|
public class ServiceResult<T, C> implements Serializable { public static final CodeMessage<String> SUCCESS = new DefaultMessage<>( "00000000" , "success" ); private T data; private CodeMessage<C> message; private boolean isSuccess; ServiceResult(T data, boolean isSuccess, CodeMessage<C> message) { this .data = data; this .message = message; this .isSuccess = isSuccess; } public T getData() { return data; } public CodeMessage<C> getCodeMessage() { return message; } public boolean isSuccess() { return isSuccess; } public static <D, C> ServiceResultBuilder<D, C> success() { ServiceResultBuilder<D, C> builder = builder(); return builder.isSuccess( true ); } public static <D, C> ServiceResultBuilder<D, C> success(CodeMessage<C> codeMessage) { ServiceResultBuilder<D, C> builder = builder(); return builder.isSuccess( true ).code(codeMessage.getCode()).message(codeMessage.getMessage()); } public static <D> ServiceResult<D, String> success(D data) { ServiceResultBuilder<D, String> success = success(SUCCESS); return success.data(data).build(); } public static <D, C> ServiceResult<D, C> error(CodeMessage<C> codeMessage) { ServiceResultBuilder<D, C> builder = builder(); return builder.isSuccess( false ).code(codeMessage.getCode()).message(codeMessage.getMessage()).build(); } public static <D, C> ServiceResultBuilder<D, C> error() { ServiceResultBuilder<D, C> builder = builder(); return builder.isSuccess( false ); } static <D, C> ServiceResultBuilder<D, C> builder() { return new ServiceResultBuilder<>(); } public static class DefaultMessage<C> implements CodeMessage<C>, java.io.Serializable { private C code; private String message; public DefaultMessage(C code, String message) { this .code = code; this .message = message; } @Override public C getCode() { return code; } @Override public String getMessage() { return message; } @Override public String toString() { return "DefaultMessage{" + "code=" + code + ", message='" + message + '\ '' + '}' ; } } public static class ServiceResultBuilder<T, C> { private T data; private C code; private String message; private boolean isSuccess; ServiceResultBuilder() { //package private } public ServiceResultBuilder<T, C> data(T data) { this .data = data; return this ; } ServiceResultBuilder<T, C> isSuccess( boolean isSuccess) { this .isSuccess = isSuccess; return this ; } public ServiceResultBuilder<T, C> code(C code) { this .code = code; return this ; } public ServiceResultBuilder<T, C> message(String message) { this .message = message; return this ; } public ServiceResult<T, C> build() { Objects.requireNonNull(code, "code" ); Objects.requireNonNull(code, "message" ); return new ServiceResult<>(data, isSuccess, new DefaultMessage<>(code, message)); } } @Override public String toString() { return "ServiceResult{" + "data=" + data + ", message=" + message + ", isSuccess=" + isSuccess + '}' ; } } |
3.使用
定義枚舉錯誤碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
pubilc enum CodeMessageEnum implements CodeMessage<Integer> { some_error( 1001 , "錯誤信息。" ); Integer code; String message; CodeMessageEnum(Integer code, String message) { this .code = code; this .message = message; } @Override public Integer getCode() { return code; } @Override public String getMessage() { return message; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//返回正確結果帶返回值。 ServiceResult<List<String>, String> s = ServiceResult.success(Arrays.asList( "1" , "2" , "3" )); s.isSuccess(); //true ServiceResult<?, Integer> e1 = ServiceResult.error(CodeMessageEnum.some_error); e1.isSuccess(); //false ServiceResult<?, Long> e2 = ServiceResult.error( new ServiceResult.DefaultMessage<>(1000L, "error" )); e2.isSuccess(); //false //ServiceResult{data=[1, 2, 3], message=DefaultMessage{code=00000000, message='success'}, isSuccess=true} System.out.println(s); //ServiceResult{data=null, message=DefaultMessage{code=1001, message='錯誤信息。'}, isSuccess=false} System.out.println(e1); //ServiceResult{data=null, message=DefaultMessage{code=1000, message='error'}, isSuccess=false} System.out.println(e2); |
補充知識: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
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
|
public class ResponseMessage { private final static String STATUS_OK = "0" ; private final static String STATUS_ERROR = "1" ; private String status; // 狀態 private Object data; // 返回值 private Exception e; // 異常類捕獲 private String msg; // 自定義信息 public String getStatus() { return status; } public void setStatus(String status) { this .status = status; } public Object getData() { return data; } public void setData(Object data) { this .data = data; } public Exception getE() { return e; } public void setE(Exception e) { this .e = e; } public String getMsg() { return msg; } public void setMsg(String msg) { this .msg = msg; } public ResponseMessage() { super (); } public ResponseMessage(String status, Object data, Exception e, String msg) { super (); this .status = status; this .data = data; this .e = e; this .msg = msg; } /** * 成功的結果 * @param data 返回結果 * @param msg 返回信息 */ public static ResponseMessage newOkInstance(Object data, String msg) { return new ResponseMessage(ResponseMessage.STATUS_OK, data, null , msg); } /** * 成功的結果 * @param data 返回結果 */ public ResponseMessage newOkInstance(Object data) { return new ResponseMessage(ResponseMessage.STATUS_OK, data, null , null ); } /** * 失敗的結果 * @param msg 返回信息 */ public static ResponseMessage newErrorInstance(String msg) { return new ResponseMessage(ResponseMessage.STATUS_ERROR, null , null , msg); } /** * 失敗的結果 * @param e 異常對象 * @param msg 返回信息 */ public static ResponseMessage newErrorInstance(Exception e, String msg) { return new ResponseMessage(ResponseMessage.STATUS_ERROR, null , e, msg); } } |
以上這篇Java封裝統一的Result Model案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/m0_38043362/article/details/79696296