Spring Boot 數據校驗@Valid+統一異常處理

在項目開發過程中controller層方法入參檢驗中存在一個問題,就是會對參數進行校驗,於是有的人就開始各種if esle,並且會產生大量的的if else

@PostMapping("/filingBankAccountOpen/applyApprove")public DataResult applyRecordApproval(@RequestBody OpenApprovalUpdateReqDTO openApprovalUpdateReqDTO) {if(openApprovalUpdateReqDTO==null){return ...}if(openApprovalUpdateReqDTO.getApprOpinio()==null){return ....}.....return recordWorkService.applyRecordApproval(openApprovalUpdateReqDTO);}

最後看看這代碼你會覺得很噁心,因爲我們可以使用巧辦法搞定的。那就是本文的內容:

1.先在你需要校驗的實體類上面加上所需要的註解

爲了測試,我自己就簡單寫了。@NotNull 和 @NotBlank 不能爲空

public class OpenApprovalUpdateReqDTO {/**      * 審批人      */ @ApiModelProperty(value = "審批人id")@NotNull(message = "approvorId爲空")private Integer approvorId;/**      * 審批意見      */ @ApiModelProperty(value = "apprOpinio審批意見爲空")private String apprOpinio;/**      * 審批標誌 ,1:通過,2:駁回      */ @ApiModelProperty(value = "審批標誌")@NotNull(message = "approvalStatus爲空")private Integer approvalStatus;/**      * 申請單id      */ @ApiModelProperty(value = "申請單id")@NotNull(message = "applyId不能爲空")private Integer applyId;/**      * 流程實例id      */ @ApiModelProperty(value = "流程實例id")@NotNull(message = "流程實例id爲空")private Integer processInstId;     //set get }

2,增加一個全局處理

@RestControllerAdvice@ExceptionHandler(寫你想要攔截的異常類型)這兩個註解必須要第一個方法是校驗異常的統一處理第二個是防止參數類型不一致的處理當然你也可以在裏面處理其他異常。
@RestControllerAdvicepublic class TreasurerExceptionHandler {private static Logger LOGGER = LoggerFactory.getLogger(TreasurerExceptionHandler.class);public TreasurerExceptionHandler() {}/**      * 校驗錯誤攔截處理      * 處理{@link Valid} & {@link NotNull}      *      * @param exception 錯誤信息集合      * @return 錯誤信息      */ @ExceptionHandler(MethodArgumentNotValidException.class)public DataResult validationBodyException(MethodArgumentNotValidException exception) {BindingResult result = exception.getBindingResult();if (result.hasErrors()) {List<ObjectError> errors = result.getAllErrors();errors.forEach(p -> {FieldError fieldError = (FieldError) p;LOGGER.warn("Data check failure : object={}, field={}, errorMessage={}", fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());});return DataResult.faild(TreasurerErrorCode.PARAM_MISSING.getErrorCode(),result.getFieldError() == null ? "請求參數有誤" : result.getFieldError().getDefaultMessage());}//其他錯誤 return DataResult.faild(TreasurerErrorCode.OTHER_ERROR.getErrorCode(), TreasurerErrorCode.OTHER_ERROR.getErrorReason());}/**      * 參數類型轉換錯誤 {@link HttpMessageConversionException}      *      * @param exception 錯誤      * @return 錯誤信息      */ @ExceptionHandler(HttpMessageConversionException.class)public DataResult parameterTypeException(HttpMessageConversionException exception) {LOGGER.warn("parameterTypeException {}", exception.getCause().getLocalizedMessage());return DataResult.faild(TreasurerErrorCode.PARAM_MISSING.getErrorCode(), "請求參數類型有誤");}}

然後把上面的controller改造一下加一個@Valid

然後測試


下面是我從別的博客收集的所有參數校驗註解的使用規則方法空檢查@Null 驗證對象是否爲null @NotNull 驗證對象是否不爲null, 無法查檢長度爲0的字符串@NotBlank 檢查約束字符串是不是Null還有被Trim的長度是否大於0,只對字符串,且會去掉前後空格.@NotEmpty 檢查約束元素是否爲NULL或者是EMPTY.Booelan檢查@AssertTrue 驗證 Boolean 對象是否爲 true @AssertFalse 驗證 Boolean 對象是否爲 false 長度檢查@Size(min=, max=) 驗證對象(Array,Collection,Map,String)長度是否在給定的範圍之內@Length(min=, max=) Validates that the annotated string is between min and max included.日期檢查@Past 驗證 Date 和 Calendar 對象是否在當前時間之前@Future 驗證 Date 和 Calendar 對象是否在當前時間之後@Pattern 驗證 String 對象是否符合正則表達式的規則數值檢查建議使用在Stirng,Integer類型,不建議使用在int類型上,因爲表單值爲“”時無法轉換爲int,但可以轉換爲Stirng爲"",Integer爲null @Min 驗證 Number 和 String 對象是否大等於指定的值@Max 驗證 Number 和 String 對象是否小等於指定的值@DecimalMax 被標註的值必須不大於約束中指定的最大值. 這個約束的參數是一個通過BigDecimal定義的最大值的字符串表示.小數存在精度@DecimalMin 被標註的值必須不小於約束中指定的最小值. 這個約束的參數是一個通過BigDecimal定義的最小值的字符串表示.小數存在精度@Digits 驗證 Number 和 String 的構成是否合法@Digits(integer=,fraction=) 驗證字符串是否是符合指定格式的數字,interger指定整數精度,fraction指定小數精度。 @Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum. @Range(min=10000,max=50000,message=“range.bean.wage”) private BigDecimal wage;@Valid 遞歸的對關聯對象進行校驗, 如果關聯對象是個集合或者數組,那麼對其中的元素進行遞歸校驗,如果是一個map,則對其中的值部分進行校驗.(是否進行遞歸驗證)@CreditCardNumber信用卡驗證@Email 驗證是否是郵件地址,如果爲null,不進行驗證,算通過驗證。@ScriptAssert(lang= ,script=, alias=)@URL(protocol=,host=, port=,regexp=, flags=)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章