Controller規(guī)范

要說Controller的規(guī)范,主要的內(nèi)容是就是接口定義里面的內(nèi)容,你只要遵循里面的規(guī)范,controller就問題不大敢会,除了這些,還有另外的幾點:

1 所有函數(shù)返回統(tǒng)一的ResultBean/PageResultBean格式这嚣,原因見接口定義這個貼鸥昏。沒有統(tǒng)一格式,AOP無法玩姐帚。
2 ResultBean/PageResultBean是controller專用的吏垮,不允許往后傳!
3 Controller做參數(shù)格式的轉(zhuǎn)換罐旗,不允許把json膳汪,map這類對象傳到services去,也不允許services返回json尤莺、map旅敷。

寫過代碼都知道,map颤霎,json這種格式靈活,但是可讀性差涂滴,如果放業(yè)務(wù)數(shù)據(jù)友酱,每次閱讀起來都比較困難。定義一個bean看著工作量多了柔纵,但代碼清晰多了缔杉。

4 參數(shù)中一般情況不允許出現(xiàn)Request,Response這些對象搁料。

主要是因為可讀性問題或详。

5 不需要打印日志

日志在AOP里面會打印系羞,而且我的建議是大部分日志在Services這層打印。
規(guī)范里面大部分是不要做的項多霸琴,要做的比較少椒振,落地比較容易。

ResultBean定義帶泛型梧乘,使用了lombok澎迎。

@Data
public class ResultBean<T> implements Serializable {

  private static final long serialVersionUID = 1L;

  public static final int NO_LOGIN = -1;

  public static final int SUCCESS = 0;

  public static final int FAIL = 1;

  public static final int NO_PERMISSION = 2;

  private String msg = "success";

  private int code = SUCCESS;

  private T data;

  public ResultBean() {
    super();
  }

  public ResultBean(T data) {
    super();
    this.data = data;
  }

  public ResultBean(Throwable e) {
    super();
    this.msg = e.toString();
    this.code = FAIL;
  }
}

AOP代碼,主要就是打印日志和捕獲異常选调,異常要區(qū)分已知異常和未知異常夹供,其中未知的異常是我們重點關(guān)注的,可以做一些郵件通知啥的仁堪,已知異诚ⅲ可以再細分一下,可以不同的異常返回不同的返回碼:

/**
 * 處理和包裝異常
 */
public class ControllerAOP {
  private static final Logger logger = LoggerFactory.getLogger(ControllerAOP.class);

  public Object handlerControllerMethod(ProceedingJoinPoint pjp) {
    long startTime = System.currentTimeMillis();

    ResultBean<?> result;

    try {
      result = (ResultBean<?>) pjp.proceed();
      logger.info(pjp.getSignature() + "use time:" + (System.currentTimeMillis() - startTime));
    } catch (Throwable e) {
      result = handlerException(pjp, e);
    }

    return result;
  }

  private ResultBean<?> handlerException(ProceedingJoinPoint pjp, Throwable e) {
    ResultBean<?> result = new ResultBean();

    // 已知異常
    if (e instanceof CheckException) {
      result.setMsg(e.getLocalizedMessage());
      result.setCode(ResultBean.FAIL);
    } else if (e instanceof UnloginException) {
      result.setMsg("Unlogin");
      result.setCode(ResultBean.NO_LOGIN);
    } else {
      logger.error(pjp.getSignature() + " error ", e);
      //TODO 未知的異常弦聂,應(yīng)該格外注意鸟辅,可以發(fā)送郵件通知等
      result.setMsg(e.toString());
      result.setCode(ResultBean.FAIL);
    }

    return result;
  }
}

AOP配置:(關(guān)于用java代碼還是xml配置,這里我傾向于xml配置横浑,因為這個會不定期改動)

<!-- aop -->
  <aop:aspectj-autoproxy />
  <beans:bean id="controllerAop" class="xxx.common.aop.ControllerAOP" />
  <aop:config>
    <aop:aspect id="myAop" ref="controllerAop">
      <aop:pointcut id="target"
        expression="execution(public xxx.common.beans.ResultBean *(..))" />
      <aop:around method="handlerControllerMethod" pointcut-ref="target" />
    </aop:aspect>
  </aop:config>

現(xiàn)在知道為什么要返回統(tǒng)一的一個ResultBean了:

  • 為了統(tǒng)一格式
  • 為了應(yīng)用AOP
  • 為了包裝異常信息

分頁的PageResultBean大同小異剔桨,大家自己依葫蘆畫瓢自己完成就好了。

貼一個簡單的controller(左邊的箭頭表示AOP攔截了)徙融。請對比 程序員你為什么這么累洒缀?里面原來的代碼查看,沒有對比就沒有傷害欺冀。

image.png

最后說一句树绩,先有統(tǒng)一的接口定義規(guī)范,然后有AOP實現(xiàn)隐轩。先有思想再有技術(shù)饺饭。技術(shù)不是關(guān)鍵,AOP技術(shù)也很簡單职车,這個帖子的關(guān)鍵點不是技術(shù)瘫俊,而是習慣和思想,不要撿了芝麻丟了西瓜悴灵。網(wǎng)絡(luò)上講技術(shù)的貼多扛芽,講習慣、風格的少积瞒,這些都是我工作多年的行之有效的經(jīng)驗之談川尖,望有緣人珍惜。

上一篇:《接口規(guī)范》
下一篇:《日志建議》

本文原著作者:曉風輕
原文鏈接:https://zhuanlan.zhihu.com/p/28705206
版權(quán)歸作者所有茫孔,轉(zhuǎn)載請注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叮喳,一起剝皮案震驚了整個濱河市被芳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馍悟,老刑警劉巖畔濒,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赋朦,居然都是意外死亡篓冲,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門宠哄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壹将,“玉大人,你說我怎么就攤上這事毛嫉》谈” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵承粤,是天一觀的道長暴区。 經(jīng)常有香客問我,道長辛臊,這世上最難降的妖魔是什么仙粱? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮彻舰,結(jié)果婚禮上伐割,老公的妹妹穿的比我還像新娘。我一直安慰自己刃唤,他們只是感情好隔心,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尚胞,像睡著了一般硬霍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笼裳,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天唯卖,我揣著相機與錄音,去河邊找鬼躬柬。 笑死耐床,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的楔脯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼胯甩,長吁一口氣:“原來是場噩夢啊……” “哼昧廷!你這毒婦竟也來了堪嫂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤木柬,失蹤者是張志新(化名)和其女友劉穎皆串,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眉枕,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡恶复,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了速挑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谤牡。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姥宝,靈堂內(nèi)的尸體忽然破棺而出翅萤,到底是詐尸還是另有隱情,我是刑警寧澤腊满,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布套么,位于F島的核電站,受9級特大地震影響碳蛋,放射性物質(zhì)發(fā)生泄漏胚泌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一肃弟、第九天 我趴在偏房一處隱蔽的房頂上張望玷室。 院中可真熱鬧,春花似錦愕乎、人聲如沸阵苇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绅项。三九已至,卻和暖如春比肄,著一層夾襖步出監(jiān)牢的瞬間快耿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工芳绩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掀亥,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓妥色,卻偏偏與公主長得像搪花,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理撮竿,服務(wù)發(fā)現(xiàn)吮便,斷路器,智...
    卡卡羅2017閱讀 134,626評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,726評論 25 707
  • 工作中幢踏,少不了要定義各種接口髓需,系統(tǒng)集成要定義接口,前后臺掉調(diào)用也要定義接口房蝉。接口定義一定程度上能反應(yīng)程序員的編程功...
    justmilkrain閱讀 639評論 1 3
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法僚匆,類相關(guān)的語法,內(nèi)部類的語法搭幻,繼承相關(guān)的語法咧擂,異常的語法,線程的語...
    子非魚_t_閱讀 31,596評論 18 399
  • 前言 最近接手了兩個 O2O 的老項目粗卜,其中的 Bug 也不言而喻屋确,單看項目中的布局就有 n 種不同的方式,有用純...
    tingxins閱讀 6,042評論 14 37