<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      五個步驟,助你優雅的寫好 Controller 層代碼!

      0
      分享至

      Java精選面試題(微信小程序):5000+道面試題和選擇題,真實面經簡歷模版,包含Java基礎、并發、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!

      Controller 層邏輯

      MVC架構下,我們的web工程結構會分為三層,自下而上是dao層,service層和controller層。controller層為控制層,主要處理外部請求,調用service層。

      一般情況下,controller層不應該包含業務邏輯,controller的功能應該有以下五點:

      ⑴、接收請求并解析參數

      ⑵、業務邏輯執行成功做出響應

      ⑶、異常處理

      ⑷、轉換業務對象

      ⑸、調用 Service 接口

      普通寫法

      @RestController publicclass TestController {     @Autowired     private UserService userService;     @PostMapping("/test") public Result service(@Validated  @RequesBody  UserRequestBo requestBo) throws Exception {         Result result = new Result();         // 參數校驗         if (StringUtils.isNotEmpty(requestBo.getId())                 || StringUtils.isNotEmpty(requestBo.getType())                 || StringUtils.isNotEmpty(requestBo.getName())                 || StringUtils.isNotEmpty(requestBo.getAge())) {             thrownew Exception("必輸項校驗失敗");         } else {             // 調用service更新user,更新可能拋出異常,要捕獲             try {                 int count = 0;                 User user = userService.queryUser(requestBo.getId());                 if (ObjectUtils.isEmpty(user)) {                     result.setCode("11111111111");                     result.setMessage("請求失敗");                     return result;                 }                 // 轉換業務對象                 UserDTO userDTO = new UserDTO();                 BeanUtils.copyProperties(requestBo, userDTO);                 if ("02".equals(user.getType())) {// 退回修改的更新                     count = userService.updateUser(userDTO)                 }elseif ("03".equals(user.getType())) {// 已生效狀態,新增一條待復核                     count = userService.addUser(userDTO);                 }                 // 組裝返回對象                 result.setData(count);                 result.setCode("00000000");                 result.setMessage("請求成功");             } catch (Exception ex) {                 // 異常處理                 result.setCode("111111111111");                 result.setMessage("請求失敗");             }         }         return result;     } }
      優化思路 1、調用 Service 層接口

      一般情況下,controller作為控制層調用service層接口,不應該包含任何業務邏輯,所有的業務操作,都放在service層實現,把controller層相關代碼去掉

      controller層就變成了:

      @RestController publicclass TestController { @Autowired private UserService userService; @PostMapping("/test") public Result service(@Validated  @RequesBody  UserRequestBo requestBo) throws Exception {     Result result = new Result();     // 參數校驗     if (StringUtils.isNotEmpty(requestBo.getId())             || StringUtils.isNotEmpty(requestBo.getType())             || StringUtils.isNotEmpty(requestBo.getName())             || StringUtils.isNotEmpty(requestBo.getAge())) {         thrownew Exception("必輸項校驗失敗");     } else {         // 調用service更新user,更新可能拋出異常,要捕獲         try {          // 轉換業務對象             UserDTO userDTO = new UserDTO();             BeanUtils.copyProperties(requestBo, userDTO);             int count = userService.updateUser(userDTO);             // 組裝返回對象             result.setData(count);             result.setCode("00000000");             result.setMessage("請求成功");         } catch (Exception ex) {             // 異常處理             result.setCode("EEEEEEEE");             result.setMessage("請求失敗");         }     }     return result; }
      2、參數校驗

      其實大多數的參數校驗就是判空或者空字符串,那么我們可以用@NotBlank等注解。在UserRequestBo類中name屬性上加上@NotBlank注解。另外,推薦公眾號Java精選,回復java面試,獲取在線面試資料,支持在線隨時隨地刷題。

      優化后如下:

      @Data public class UserRequestBo {     @NotBlank     private String id;     @NotBlank     private String type;     @NotBlank     private String name;     @NotBlank     private String age; }

      controller層就變成了:

      @RestController publicclass TestController {     @Autowired     private UserService userService;     @PostMapping("/test")     public Result service( @Validated  @RequesBody  UserRequestBo requestBo) throws Exception {         Result result = new Result();         // 調用service更新user,更新可能拋出異常,要捕獲         try {          // 轉換業務對象             UserDTO userDTO = new UserDTO();             BeanUtils.copyProperties(requestBo, userDTO);             int count = userService.updateUser(userDTO);             // 組裝返回對象             result.setData(count);             result.setCode("00000000");             result.setMessage("請求成功");         } catch (Exception ex) {             // 異常處理             result.setCode("EEEEEEEE");             result.setMessage("請求失敗");         }         return result;     } }

      備注:@NotNull、@NotBlank、@NotEmpty的區別,也適用于代碼中的校驗方法


      • @NotNull:平常用于基本數據的包裝類(Integer,Long,Double等等),如果@NotNull 注解被使用在 String 類型的數據上,則表示該數據不能為 Null,但是可以為空字符串(“”),空格字符串(“ ”)等。

      • @NotEmpty:平常用于 String、Collection集合、Map、數組等等,@NotEmpty注解的參數不能為 Null 或者 長度為 0,如果用在String類型上,則字符串也不能為空字符串(“”), 但是空格字符串(“ ”)不會被校驗住。

      • @NotBlank:平常用于 String 類型的數據上,加了@NotBlank注解的參數不能為 Null ,不能為空字符串(“”), 也不能會空格字符串(“ ”),多了一個trim()得到效果。

      3、統一封裝返回對象

      代碼中無論是業務成功或者失敗,都需要封裝返回對象,目前代碼中都是哪里用到就在哪里進行封裝

      我們可以統一封裝返回對象

      優化后如下:

      @Data publicclass Result
      
        {     private String code;     private String message;     private T data; // 請求成功,指定data     publicstatic    Result   success(T data) {         returnnew Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);     }      // 請求成功,指定data和指定message     publicstatic    Result   success(String message, T data) {         returnnew Result<>(ResultEnum.SUCCESS.getCode(), message, data);     }      // 請求失敗     publicstatic Result failed() {         returnnew Result<>(ResultEnum.COMMON_FAILED.getCode(), ResultEnum.COMMON_FAILED.getMessage(), null);     }      // 請求失敗,指定message     publicstatic Result failed(String message) {         returnnew Result<>(ResultEnum.COMMON_FAILED.getCode(), message, null);     }          // 請求失敗,指定code和message     publicstatic Result failed(String code, String message) {         returnnew Result<>(code, message, null);     } }
      

      controller層就變成了:

      @RestController publicclass TestController {     @Autowired     private UserService userService;     @PostMapping("/test")     public Result service(@Validated  @RequesBody  UserRequestBo requestBo) throws Exception {         // 調用service更新user,更新可能拋出異常,要捕獲         try {          // 轉換業務對象             UserDTO userDTO = new UserDTO();             BeanUtils.copyProperties(requestBo, userDTO);             int count = userService.updateUser(userDTO);             // 組裝返回對象             Result.success(count);         } catch (Exception ex) {             // 異常處理             Result.failed(ex.getMessage());         }     } } 
      4、統一的異常捕獲

      Controller層和service存在大量的try-catch,都是重復代碼并且看起來也不優雅??梢越ocontroller層的方法加上切面來統一處理異常。

      @ControllerAdvice注解(@RestControllerAdvice也可以),用來定義controller層的切面,添加@Controller注解的類中的方法執行都會進入該切面,同時我們可以使用@ExceptionHandler來對不同的異常進行捕獲和處理,對于捕獲的異常,我們可以進行日志記錄,并且封裝返回對象。

      優化后如下:

      // @RestControllerAdvice(basePackages = "com.ruoyi.web.controller.demo.test"), 指定包路徑進行切面 // @RestControllerAdvice(basePackageClasses = TestController.class) , 指定Contrller.class進行切面 // @RestControllerAdvice 不帶參數默認覆蓋所有添加@Controller注解的類 @RestControllerAdvice(basePackageClasses = TestController.class) public class TestControllerAdvice {     @Autowired     HttpServletRequest httpServletRequest;     private void logErrorRequest(Exception e){         // 組裝日志內容         String logInfo = String.format("報錯API URL: %S, error = ", httpServletRequest.getRequestURI(), e.getMessage());         // 打印日志         System.out.println(logInfo);     }     /**      * {@code @RequestBody} 參數校驗不通過時拋出的異常處理      */     @ExceptionHandler({MethodArgumentNotValidException.class})     public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {         // 打印日志         logErrorRequest(ex);         // 組織異常信息,可能存在多個參數校驗失敗         BindingResult bindingResult = ex.getBindingResult();         StringBuilder sb = new StringBuilder("校驗失敗:");         for (FieldError fieldError : bindingResult.getFieldErrors()) {        sb.append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage()).append(", ");         }         return Result.failed(ResultEnum.VALIDATE_FAILED.getCode(), sb.toString());     }     /**      * 業務層異常,如果項目中有自定義異常則使用自定義業務異常,如果沒有,可以和其他異常一起處理      *      * @param exception      * @return      */     @ExceptionHandler(RuntimeException.class)     protected Result serviceException(RuntimeException exception) {         logErrorRequest(exception);         return Result.failed(exception.getMessage());     }     /**      * 其他異常      *      * @param exception      * @return      */     @ExceptionHandler({HttpClientErrorException.class, IOException.class, Exception.class})     protected Result serviceException(Exception exception) {         logErrorRequest(exception);         return Result.failed(exception.getMessage());     } }

      controller層就變成了:

      @RestController publicclass TestController {     @Autowired     private UserService userService;     @PostMapping("/test")     public Result service( @Validated  @RequesBody  UserRequestBo requestBo) throws Exception {         UserDTO userDTO = new UserDTO();         BeanUtils.copyProperties(requestBo, userDTO);         // 調用service層接口         int count = userService.updateUser(userDTO);         //組裝返回對象         return Result.success(count);     } }
      5、轉換業務對象

      代碼中可能有很多個地方轉換同一個業務對象,入參UserRequestBo可以轉換為userDTO,可以理解為這是UserRequestBo的一個特性或者能力,我們可以參考充血模式的思想,在UserRequestBo中定義convertToUserDTO方法,我們的目的是轉換業務對象,至于使用什么方式轉換,調用方并不關心,現在使用的BeanUtils.copyProperties(),如果有一天想修改成使用Mapstruct來進行對象轉換,只需要修改UserRequestBoconvertToUserDTO方法即可,不會涉及到業務代碼的修改。

      優化后代碼:

      @Data publicclass UserRequestBo {     @NotBlank     private String id;     @NotBlank     private String type;     @NotBlank     private String name;     @NotBlank     private String age;     /**      * UserRequestBo對象為UserDTO      * */     public UserDTO convertToUserDTO(){         UserDTO userDTO = new UserDTO();         // BeanUtils.copyProperties要求字段名和字段類型都要保持一致,如果有不一樣的字段,需要單獨set         BeanUtils.copyProperties(this, userDTO);         userDTO.setType(this.getType());         return userDTO;     } }

      controller層就變成了:

      @RestController public class TestController {     @Autowired     private UserService userService;     @PostMapping("/test")     public Result service(@Validated  @RequesBody  UserRequestBo requestBo) throws Exception {         return Result.success(userService.updateUser(requestBo.convertToUserDTO()));     } }

      優化結束,打完收工。

      作者:桃花影落丶飛神劍

      https://blog.csdn.net/weixin_44271364/article/details/129157011

      公眾號“Java精選”所發表內容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯系,筆者會第一時間刪除處理!

      最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!

      文章有幫助的話,點在看,轉發吧!

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      總有人納悶,王健林就算只剩100億,為啥王思聰花錢還是那么大方

      總有人納悶,王健林就算只剩100億,為啥王思聰花錢還是那么大方

      小光侃娛樂
      2025-12-10 22:10:04
      瓜帥:我不想以被解雇的方式離開,我想好好結束

      瓜帥:我不想以被解雇的方式離開,我想好好結束

      懂球帝
      2025-12-20 15:09:22
      何穗忙完工作一天也不想帶娃!回家換完衣跑去看展覽,當媽后多愁

      何穗忙完工作一天也不想帶娃!回家換完衣跑去看展覽,當媽后多愁

      趕山的姑娘
      2025-12-20 21:23:24
      湘潭一村民組開會決議將“外嫁女”所得法院執行款項從其親屬頭上扣除,村支書:對決議不知情,未簽字批準

      湘潭一村民組開會決議將“外嫁女”所得法院執行款項從其親屬頭上扣除,村支書:對決議不知情,未簽字批準

      紅星新聞
      2025-12-20 00:33:11
      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      北京阿姨20年守茅臺股票:90萬本金,分紅326萬,成本歸零!

      趣文說娛
      2025-12-20 18:29:20
      少一人仍不輸,47歲蘭帕德率隊1-1,狂攬48分領跑+領先米堡6分

      少一人仍不輸,47歲蘭帕德率隊1-1,狂攬48分領跑+領先米堡6分

      側身凌空斬
      2025-12-20 22:31:10
      上海迪士尼突發一幕,演出被迫中斷!網友:她還在笑,心太大了

      上海迪士尼突發一幕,演出被迫中斷!網友:她還在笑,心太大了

      環球網資訊
      2025-12-20 09:29:14
      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      我外交部突然發出警告,如果外媒消息屬實,中日事態將會相當嚴重

      芊芊子吟
      2025-12-20 14:07:18
      人類文明現在只有0.73級,宇宙中的7級文明有多可怕?

      人類文明現在只有0.73級,宇宙中的7級文明有多可怕?

      觀察宇宙
      2025-12-20 20:55:31
      金正恩做出重大舉動,矛頭直指高市早苗

      金正恩做出重大舉動,矛頭直指高市早苗

      回京歷史夢
      2025-12-21 02:40:04
      阿房宮遺址考古取得突破性進展

      阿房宮遺址考古取得突破性進展

      環球網資訊
      2025-12-20 15:09:09
      金毛事件大反轉!為減刑出賣白三姐,20萬轉賬記錄撕開人性遮羞布

      金毛事件大反轉!為減刑出賣白三姐,20萬轉賬記錄撕開人性遮羞布

      魔都姐姐雜談
      2025-12-20 04:48:09
      咖啡再次被關注!醫生發現:高血壓患者經常喝咖啡,或有5改善

      咖啡再次被關注!醫生發現:高血壓患者經常喝咖啡,或有5改善

      牛鍋巴小釩
      2025-12-20 16:45:23
      中央明確規定:從明年起,將對普通高中進行擴招。

      中央明確規定:從明年起,將對普通高中進行擴招。

      百態人間
      2025-12-18 05:00:04
      于東來回應高薪招聘英才:哪怕年薪2000萬都無所謂,給的不是財富,是尊重

      于東來回應高薪招聘英才:哪怕年薪2000萬都無所謂,給的不是財富,是尊重

      都市快報橙柿互動
      2025-12-20 11:30:57
      努諾:丟球過早讓一切變得困難,幾個丟球我們都可以做得更好

      努諾:丟球過早讓一切變得困難,幾個丟球我們都可以做得更好

      懂球帝
      2025-12-21 02:00:07
      王楚欽傳來壞消息:背傷診斷結果曝光!林詩棟17天打3站,不休息

      王楚欽傳來壞消息:背傷診斷結果曝光!林詩棟17天打3站,不休息

      侃球熊弟
      2025-12-20 00:15:03
      池莉:半輩子過去了,自己盡是不體面和不高貴,遍體鱗傷

      池莉:半輩子過去了,自己盡是不體面和不高貴,遍體鱗傷

      尚曦讀史
      2025-12-18 09:46:21
      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      市監局通報“南極磷蝦油”事件:已成立聯合調查組進駐北京同仁堂(四川)健康藥業有限公司開展調查,已對該企業立案

      極目新聞
      2025-12-20 19:28:56
      底層無貴人,社交無意義

      底層無貴人,社交無意義

      詩詞中國
      2025-12-19 20:34:22
      2025-12-21 03:40:49
      Java精選
      Java精選
      一場永遠也演不完的戲
      1764文章數 3859關注度
      往期回顧 全部

      科技要聞

      許四清:具身智能的"ChatGPT時刻"還未到來

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      頭條要聞

      臺北致4人身亡嫌犯被指是"大陸籍" 蔣萬安回應

      體育要聞

      我開了20年大巴,現在是一名西甲主帥

      娛樂要聞

      2026央視跨年晚會陣容曝光,豪華陣仗

      財經要聞

      求解“地方財政困難”

      汽車要聞

      嵐圖推進L3量產測試 已完成11萬公里實際道路驗證

      態度原創

      家居
      數碼
      房產
      游戲
      軍事航空

      家居要聞

      高端私宅 理想隱居圣地

      數碼要聞

      一屏多用:華為Mate X7 / XTs折疊屏手機“變身”智能手卡

      房產要聞

      廣州有態度,一座國際化社區給出的城市答案

      逆天!LCK頒獎Faker無緣獎項,LPL解說炮轟開罵直播間差點被封

      軍事要聞

      澤連斯基:前線局勢愈發艱難

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 福利姬液液酱喷水| 鹤壁市| 日本另类αv欧美另类aⅴ| 精品无码人妻| 久久99人妻无码精品一区| 性一交一黄一片| 国产SM重味一区二区三区| 亚洲精品无码一区二区| 中阳县| 女人香蕉久久毛毛片精品| 少妇高潮灌满白浆毛片免费看 | 五月天激情影院| 久久综合九色综合网站| 强奸福利视频在线观看| 亚洲精品一区二区三| 日本少妇xxx做受| 色综合网址你懂的| 亚洲一区二区三区在线| 青草内射中出高潮| 四虎成人精品无码| 精品熟人妻一区二区三区四区不卡| 成熟女人特级毛片www免费| 黄色综合| 久久久久久久久久8888| 国产a在视频线精品视频下载| 玩弄少妇人妻| 欧美日韩人成综合在线播放| 中文字幕熟女| 国产精品AV在线观看| 亚洲AV成人无码久久精品四虎| 国产av成人一区二区三区| 欧美日韩不卡合集视频| 武宁县| 国产VA在线视频观看| 成人性生交片无码免费看| 国产后入又长又硬| 精人妻无码一区二区三区| 国产成人一区二区三区别| 中西区| 中年熟女网| 人妻系列中文字幕精品|