日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常

發(fā)布時間:2025/3/11 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(一)概述

異常處理是一個系統(tǒng)最重要的環(huán)節(jié),當一個項目變得很大的時候,異常處理和日志系統(tǒng)能讓你快速定位到問題。對于用戶或者接口調用者而言,優(yōu)雅的異常處理可以讓調用者快速知道問題所在。本文將介紹如何優(yōu)雅地處理異常。

(二)使用通用的返回體

我們希望所有的錯誤都以Json的方式返回給客戶,因此拿出上次寫的通用返回體,新建一個類CommonResult記錄返回體。

@Data@AllArgsConstructor@NoArgsConstructorpublic class CommonResult { private int code; private String message; private Object data;}復制代碼

新建一個枚舉類ResponseCode集成code和message。

public enum ResponseCode { // 系統(tǒng)模塊 SUCCESS(0, "操作成功"), ERROR(1, "操作失敗"), SERVER_ERROR(500, "服務器異常"), // 通用模塊 1xxxx ILLEGAL_ARGUMENT(10000, "參數(shù)不合法"), REPETITIVE_OPERATION(10001, "請勿重復操作"), ACCESS_LIMIT(10002, "請求太頻繁, 請稍后再試"), MAIL_SEND_SUCCESS(10003, "郵件發(fā)送成功"), // 用戶模塊 2xxxx NEED_LOGIN(20001, "登錄失效"), USERNAME_OR_PASSWORD_EMPTY(20002, "用戶名或密碼不能為空"), USERNAME_OR_PASSWORD_WRONG(20003, "用戶名或密碼錯誤"), USER_NOT_EXISTS(20004, "用戶不存在"), WRONG_PASSWORD(20005, "密碼錯誤"), ; ResponseCode(Integer code, String msg) { this.code = code; this.msg = msg; } private Integer code; private String msg; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }}復制代碼

(三)自定義運行時異常

自定義一個運行時異常類,構造方法傳入異常參數(shù)即可。

public class MyException extends RuntimeException{ private String msg; public MyException(String msg) { super(msg); }}復制代碼

(四)編寫一個統(tǒng)一的異常處理類

異常處理類是整個異常處理核心,SpringBoot中提供了ControllerAdvice注解來攔截異常,使用RestControllerAdvice注解保證了返回Json格式。

如果攔截到的異常屬于MyException,則按Json格式返回錯誤結果。

@RestControllerAdvicepublic class ExceptionController { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(value = Exception.class) public CommonResult exceptionHandler(Exception e){ //如果拋出的異常屬于自定義異常,就以JSON格式返回 if (e instanceof MyException){ return new CommonResult(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getMsg(),"自定義的錯誤為:"+e.getMessage()); } //如果都不是就打印出異常的信息 return new CommonResult(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getMsg(),"錯誤的信息為:"+e.getMessage()); }}復制代碼

(五)測試

為了看初效果,這里手動拋出一個異常來測試,新建IndexController,手動拋出異常

@RestControllerpublic class IndexController { @RequestMapping(value = "/index",method = RequestMethod.GET) public String index(){ throw new MyException("測試"); }}復制代碼

查看調用結果:

(六)對實體類的校驗

有這樣一個場景,登陸注冊時用戶名和密碼有長度限制,手機號有格式限制,如果不滿足要求就無法注冊。這個功能前端可以限制,但是對于后端接口而言,也需要進行限制,萬一前端沒有限制住呢。

導入兩個校驗依賴包:

javax.validation validation-api 2.0.1.Finalorg.hibernate hibernate-validator 6.1.0.Final復制代碼

編寫實體類,在每個屬性上加上校驗包的驗證參數(shù)。

@Datapublic class Register { @Length(max = 20,min = 4,message = "用戶名長度需要在4到20個字符之間") @NotBlank(message = "用戶名不能為空") private String username; @NotBlank(message = "手機號不能為空") @Pattern(regexp = "^1[3|4|5|8][0-9]d{8}$",message = "電話號碼格式不正確") private String phone; @Length(max = 20,min = 4,message = "密碼長度需要在4到20個字符之間") @NotBlank(message = "密碼不能為空") private String password;}復制代碼

我們在需要使用的方法中增加@Valid注解進行校驗,比如這個post請求中我要校驗。

@PostMapping("/register")public CommonResult register(@Valid @RequestBody Register register){ //一連串注冊的業(yè)務 userService.registerUser(register); return new CommonResult(ResponseCode.SUCCESS.getCode(),ResponseCode.SUCCESS.getMsg(),"");}復制代碼

@Valid在校驗失敗的情況下會報出參數(shù)不合法的異常,還是在統(tǒng)一的異常處理類中捕獲異常,如果是MethodArgumentNotValidException,就取出對應的message數(shù)據(jù)。

@RestControllerAdvicepublic class ExceptionController { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(value = Exception.class) public CommonResult exceptionHandler(Exception e){ //如果屬于參數(shù)校驗異常,就拋出校驗的錯誤 if (e instanceof MethodArgumentNotValidException){ MethodArgumentNotValidException methodArgumentNotValidException= (MethodArgumentNotValidException) e; return new CommonResult(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getMsg(), "校驗錯誤:"+methodArgumentNotValidException.getBindingResult().getFieldError().getDefaultMessage()); }//如果是自定義的異常,就給出具體的異常原因 else if (e instanceof MyException){ return new CommonResult(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getMsg(),"自定義的錯誤為:"+e.getMessage()); } //如果都不是就打印出異常的信息 return new CommonResult(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getMsg(),"錯誤的信息為:"+e.getMessage()); }}復制代碼

(七)測試校驗

接下來就可以測試校驗的功能了,通過postman訪問

如果輸入?yún)?shù)不滿足之前的設置,就會給出具體的錯誤信息。而不是拋出讓人無法接收的報錯:

(八)總結

許多人寫代碼時最不考慮的就是異常處理,簡單地實現(xiàn)需求就好了,所以才會導致許多不可預估的bug出現(xiàn)。好了,本期文章就到這里了,我們下期再見。

看完三件事??

如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:

  • 點贊,轉發(fā),有你們的 『點贊和評論』,才是我創(chuàng)造的動力。
  • 關注頭條號 『 JAVA后端架構 』,不定期分享原創(chuàng)知識。
  • 同時可以期待后續(xù)文章ing
  • 關注作者后臺私信【888】有驚喜相送
  • 總結

    以上是生活随笔為你收集整理的java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。