摘要:在學(xué)校做一個(gè)校企合作項(xiàng)目,注冊(cè)登錄這一塊需要對(duì)注冊(cè)登錄進(jìn)行輸入合法的服務(wù)器端驗(yàn)證,因?yàn)槭乔昂蠖朔蛛x開發(fā),所以要求返回?cái)?shù)據(jù)。
在學(xué)校做一個(gè)校企合作項(xiàng)目,注冊(cè)登錄這一塊需要對(duì)注冊(cè)登錄進(jìn)行輸入合法的服務(wù)器端驗(yàn)證,因?yàn)槭乔昂蠖朔蛛x開發(fā),所以要求返回JSON數(shù)據(jù)。
方法有很多,這覺得用全局異常處理比較容易上手
首先來創(chuàng)建一個(gè)sprIngboot的web項(xiàng)目或模塊,目錄結(jié)構(gòu)如下
實(shí)體類User.java
@Data public class User { private String userName; private String passwold; }
實(shí)體類UserResult.java 把數(shù)據(jù)封裝到這里返回到客戶端
@Data @NoArgsConstructor @AllArgsConstructor public class UserResult { private int code; private String msg; }接下來自定義異常,都繼承自Exception
UserNullException.java 當(dāng)用戶名為空拋出這個(gè)異常
public class UserNullException extends Exception{ public UserNullException() { super("用戶名不能為空"); } }
PasswoldNullException.java 當(dāng)密碼為空拋出這個(gè)異常
public class PasswoldNullException extends Exception { public PasswoldNullException() { super("密碼不能為空"); } }
UserNamePasswordNullException.java 當(dāng)用戶名和密碼都為空拋出這個(gè)異常
public class UserNamePasswordNullException extends Exception { public UserNamePasswordNullException() { super("請(qǐng)輸入用戶名和密碼"); } }
UserNameValidationException.jva 當(dāng)輸入不符合要求的用戶名時(shí)拋出此異常
public class UserNameValidationException extends Exception{ public UserNameValidationException() { super("請(qǐng)輸入6到16位的數(shù)字或字母組合"); } }
UserNamePasswordNullException.java 當(dāng)輸入的密碼不符合要求時(shí)拋出這個(gè)異常
public class UserNamePasswordNullException extends Exception { public UserNamePasswordNullException() { super("請(qǐng)輸入用戶名和密碼"); } }通過注解的方式捕獲異常
@Controller + @ExceptionHandler
@ControllerAdvice + @ExceptionHandler
若返回的不是頁面,把@Controller換成@RestController,@ControllerAdvice換成@RestControllerAdvice,也可以在@Controller類下的方法那里加上@ResponseBody
@Controller:注解此類是Controller類
@ExceptionHandler:此注解注解到類的方法上,當(dāng)此注解里定義的異常拋出時(shí),此方法會(huì)被執(zhí)行。如果@ExceptionHandler所在的類是@Controller,則此方法只作用在此類。如果@ExceptionHandler所在的類是@ControllerAdvice,則此方法會(huì)作用在全局
在這里我只進(jìn)行了全局異常的捕獲,就是只用了@RestControllerAdvice,對(duì)全部controller層進(jìn)行了異常監(jiān)控,任何控制層拋出常,只要@RestControllerAdvice類下@ExceptionHandler注解的value值指定有的都會(huì)被執(zhí)行
@RestControllerAdvice public class UserExceptionHandler { @ExceptionHandler(value = UserNullException.class) public @ResponseBody UserResult userNull(HttpServletRequest request,Exception ex) { UserResult userResult=new UserResult(); userResult.setCode(9); userResult.setMsg(ex.getMessage()); return userResult; } @ExceptionHandler(value = PasswoldNullException.class) public UserResult passwordNull(HttpServletRequest request,Exception ex) { UserResult userResult=new UserResult(); userResult.setCode(10); userResult.setMsg(ex.getMessage()); return userResult; } @ExceptionHandler(value = UserNamePasswordNullException.class) public @ResponseBody UserResult namePassNull(HttpServletRequest request,Exception ex) { UserResult userResult=new UserResult(); userResult.setCode(11); userResult.setMsg(ex.getMessage()); return userResult; } @ExceptionHandler(value = UserNameValidationException.class) public @ResponseBody UserResult UserNameValidation(HttpServletRequest request,Exception ex) { UserResult userResult=new UserResult(); userResult.setCode(12); userResult.setMsg(ex.getMessage()); return userResult; } @ExceptionHandler(value = PasswordValidationException.class) public @ResponseBody UserResult PasswordValidation(HttpServletRequest request,Exception ex) { UserResult userResult=new UserResult(); userResult.setCode(13); userResult.setMsg(ex.getMessage()); return userResult; } }
在這里SignInController.java是全局異常捕獲類
@RestControllerAdvice @RequestMapping(value = "user/api") public class SignInController { @PostMapping(value = "/sign_in") public UserResult signIn(@RequestBody User user) throws Exception { if (user.getUserName()==null&&user.getPasswold()==null) { throw new UserNamePasswordNullException(); }else if (user.getUserName()==null) { throw new UserNullException(); }else if (user.getPasswold()==null) { throw new PasswoldNullException(); }else { if (userNameRegex(user.getUserName())==false){ throw new UserNameValidationException(); }else if (passRegex(user.getPasswold())==false){ throw new PasswordValidationException(); } } return new UserResult(0,"登錄成功"); } /** * 正則表達(dá)式:驗(yàn)證規(guī)則 */ public static final String REGEX_PASSWORD = "^[a-zA-Z0-9]{6,16}$"; /** * 手機(jī)號(hào) */ String PHONE_NUMBER_REG = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])d{8}$"; public boolean userNameRegex(String userName) { return Pattern.matches(REGEX_PASSWORD, userName); } public boolean passRegex(String password) { return Pattern.matches(REGEX_PASSWORD, password); } }
加為要求前端傳的是JSON數(shù)據(jù),所以對(duì)象參數(shù)前務(wù)必加上@RequestBody這個(gè)注解(踩過坑)
項(xiàng)目中加入了swagger配置(swagger簡(jiǎn)單使用),這里用來輸入幾條數(shù)據(jù)進(jìn)行測(cè)試
github代碼個(gè)人網(wǎng)站
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77629.html
摘要:開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問題前后端分離二使用完美處理權(quán)限問題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來越多時(shí),大家搜索起來就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...
摘要:時(shí)間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼個(gè)人學(xué)習(xí)源碼第一章課程介紹課程介紹本課程緊接著小時(shí)學(xué)會(huì)課程,請(qǐng)先看入門課。異常返回通知在連接點(diǎn)拋出異常后執(zhí)行。 時(shí)間:2017年3月19日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:htt...
摘要:端項(xiàng)目依賴添加是為了使應(yīng)用處于啟動(dòng)狀態(tài),會(huì)自動(dòng)添加相關(guān)依賴。接下來以作為服務(wù)發(fā)現(xiàn)的示例來進(jìn)行演示,實(shí)際上也可以使用或者。最后是一個(gè)用方式監(jiān)聽的使用連接端 【前情提要】Spring Boot Actuator 提供了對(duì)單個(gè) Spring Boot 應(yīng)用的監(jiān)控,信息包含應(yīng)用狀態(tài)、內(nèi)存、線程、堆棧等,比較全面的監(jiān)控了 Spring Boot 應(yīng)用的整個(gè)生命周期。但是這樣監(jiān)控也有一些問題:第一...
摘要:邊界清晰,有利于理解開發(fā)測(cè)試和部署。前后端分離考慮到目前開發(fā)流行前后端分離,為了適應(yīng)潮流,引入前后端分離的約束。該請(qǐng)求被接受處理,但是該處理是不完整的。 本文欲回答這樣一個(gè)問題:在 「特定環(huán)境 」下,如何規(guī)劃Web開發(fā)框架,使其能滿足 「期望 」? 假設(shè)我們的「特定環(huán)境 」如下: 技術(shù)層面 使用Java語言進(jìn)行開發(fā) 通過Maven構(gòu)建 基于SpringBoot 使用Intelli...
閱讀 3093·2021-09-22 15:20
閱讀 2610·2019-08-30 15:54
閱讀 1975·2019-08-30 14:06
閱讀 3123·2019-08-30 13:05
閱讀 2467·2019-08-29 18:36
閱讀 580·2019-08-29 15:10
閱讀 533·2019-08-29 11:17
閱讀 833·2019-08-28 18:11