生活随笔
收集整理的這篇文章主要介紹了
SpringBoot项目中Controller层代码编写规范整理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Controller層代碼規范
- SpringMVC接口定義要注意以下常見的幾種問題
- 1. 返回格式不統一
- 2. 沒有考慮失敗情況
- 3. 出現和業務無關的輸入參數
Controller層代碼規范
主要的內容是就是接口定義里面的內容,你只要遵循里面的規范,controller就問題不大,除了這些,還有另外的幾點:
所有函數返回統一的ResultBean/PageResultBean格式;沒有統一格式,AOP無法玩.ResultBean/PageResultBean是controller專用的,不允許往后傳Controller做參數格式的轉換,不允許把json,map這類對象傳到services去,也不允許services返回json、map。
SpringMVC接口定義要注意以下常見的幾種問題
1. 返回格式不統一
同一個接口,有時候返回數組,有時候返回單個;成功的時候返回對象,失敗的時候返回錯誤信息字符串。工作中有個系統集成就是這樣定義的接口,真是辣眼睛。這個對應代碼上,返回的類型是map,json,object,都是不應該的。實際工作中,我們會定義一個統一的格式,就是ResultBean,分頁的有另外一個PageResultBean
錯誤范例:
@PostMapping("/delete") public Map<String, Object> delete(long id
, String lang
) { } @PostMapping("/delete") public Objectdelete(long id
, String lang
) { try { boolean result
= configService
.delete(id
, local
); return result
; } catch (Exception e
) {log
.error(e
); return e
.toString(); } }
2. 沒有考慮失敗情況
一開始只考慮成功場景,等后面測試發現有錯誤情況,怎么辦,改接口唄,前后臺都改,勞民傷財無用功。
錯誤范例:
@PostMapping("/update")
public void update(long id
, xxx
) { }
3. 出現和業務無關的輸入參數
如lang語言,當前用戶信息 都不應該出現參數里面,應該從當前會話里面獲取。后面講ThreadLocal會說到怎么樣去掉。除了代碼可讀性不好問題外,尤其是參數出現當前用戶信息的,這是個嚴重問題。
錯誤范例:
@PostMapping("/delete")
public Map<String, Object> delete(long id
,String lang
, String userId
) { }
出現復雜的輸入參數
一般情況下,不允許出現例如json字符串這樣的參數,這種參數可讀性極差。應該定義對應的bean。(不絕對)
錯誤范例:
@PostMapping("/update")
public Map<String, Object> update(long id
, String jsonStr
) { }
沒有返回應該返回的數據
例如 口一般情況下應該返回新對象的id標識,這需要編程經驗。新手定義的時候因為前臺沒有用就不返回數據或者只返回true,這都是不恰當的。別人要不要是別人的事情,你該返回的還是應該返回。
錯誤范例:
@PostMapping("/add")
public boolean add(xxx
) {
很多人看了我的這篇文章程序員你為什么這么累?,都覺得里面的技術也很簡單,沒有什么特別的地方,但是,實現這個代碼框架之前,就是要你的接口的統一的格式ResultBean,aop才好做。有些人誤解了,我那篇文章說的都不是技術,重點說的是編碼習慣工作方式,如果你重點還是放在什么技術上,那我也幫不了你了。同樣,如果我后面的關于習慣和規范的帖子,你重點還是放在技術上的話,那是丟了西瓜撿芝麻,有很多貼還是沒有任何技術點呢。
附上ResultBean,沒有任何技術含量:
@Getter
@ApiModel(value
= "響應信息主體")
public class R<T> implements Serializable {private static final long serialVersionUID
= 1L;@ApiModelProperty(value
= "狀態碼")private int code
;@ApiModelProperty(value
= "消息")private Object message
= "success";@ApiModelProperty(value
= "數據結果集")private T data
;@ApiModelProperty(value
= "時間戳")private final long time
= System.currentTimeMillis();public R<T> setMessage(Object message
) {this.message
= message
;return this;}public R<T> setMessage(String format
, Object... args
) {this.message
= new Formatter().format(format
, args
).toString();return this;}public R() {}private R(ResultConstant resultConstant
, T data
) {this.code
= resultConstant
.getCode();this.message
= resultConstant
.getMessage();this.data
= data
;}public static <T> R<T> ok() {return restResult(ResultConstant.SUCCESS
, null, null);}public static <T> R<T> ok(T data
) {return restResult(ResultConstant.SUCCESS
, null, data
);}public static <T> R<T> ok(T data
, Object message
) {return restResult(ResultConstant.SUCCESS
, message
, data
);}public static <T> R<T> failed(ResultConstant resultConstant
) {return restResult(resultConstant
, null, null);}public static <T> R<T> failed(ResultConstant resultConstant
, Object message
) {return restResult(resultConstant
, message
, null);}public static <T> R<T> failed(ResultConstant resultConstant
, Object message
, T data
) {return restResult(resultConstant
, message
, data
);}private static <T> R<T> restResult(ResultConstant resultConstant
, Object message
, T data
) {R<T> apiResult
= new R<>(resultConstant
, data
);if (null != message
) {apiResult
.setMessage(message
);}return apiResult
;}
}
統一的接口規范,能幫忙規避很多無用的返工修改和可能出現的問題。能使代碼可讀性更加好,利于進行aop和自動化測試這些額外工作。
總結
以上是生活随笔為你收集整理的SpringBoot项目中Controller层代码编写规范整理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。