国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例

瀏覽:27日期:2023-04-27 11:29:04

我們在開發(fā)Java項目的時候,經(jīng)常需要對參數(shù)進行一些必填項、格式、長度等進行校驗,如果手寫代碼對參數(shù)校驗,每個接口會需要很多低級的代碼,這樣會降低代碼的可讀性。那么我們能不能使用一種比較優(yōu)雅的方式來實現(xiàn),對請求中的參數(shù)進行校驗?zāi)兀?/p>

knife4j的安裝與使用可參考我的博客:SpringBoot使用knife4j進行在線接口調(diào)試

正文

ValidationApi框架就是用來解決參數(shù)校驗中代碼冗余問題,ValidationApi框架提供一些注解用來幫助我們對請求參數(shù)進行校驗:

SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例

SpringBoot使用validation-api實現(xiàn)參數(shù)校驗

注入依賴

<!--參數(shù)校驗--><dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version></dependency><!--提供一些字符串操作--><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version></dependency><!--lombok--><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional></dependency><!--knife4j接口--><dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.4</version></dependency>

UserPojoReq.java請求封裝類

如果成員變量是其他對象實體,該變量必須加 @Valid,否則嵌套中的驗證不生效

@Setter@Getter@ToString@ApiModel('用戶對象')public class UserPojoReq extends Request implements Serializable { private static final long serialVersionUID = -354657839724457905L; @ApiModelProperty(required = true, notes = '主鍵', example = '123') private String id; @ApiModelProperty(required = true, notes = '用戶名', example = 'luo') @NotNull(message = '用戶姓名為必填項,不得為空') @Size(min = 2,max = 20,message = '用戶名長度要在2—8個字符') private String name; @ApiModelProperty(required = true, notes = '消息', example = '消息') private String msg;}

CouponTypeEnum.class :錯誤碼枚舉類

@Getterpublic enum CouponTypeEnum { PARAMETER_ERROR(1001, '請求參數(shù)有誤!'), UNKNOWN_ERROR(9999, '未知的錯誤!”); /** * 狀態(tài)值 */ private int couponType; /** * 狀態(tài)描述 */ private String couponTypeDesc; CouponTypeEnum(int couponType, String couponTypeDesc){ this.couponType = couponType; this.couponTypeDesc = couponTypeDesc; } public static String getDescByType(int couponType) { for (CouponTypeEnum type : CouponTypeEnum.values()) { if (type.couponType == couponType) {return type.couponTypeDesc; } } return null; } public String getcouponTypeStr(){ return String.valueOf(this.couponType); }}

BusinessException.java:自定義業(yè)務(wù)異常類

/** * 業(yè)務(wù)自定義異常 */@Getterpublic class BusinessException extends RuntimeException { private static final long serialVersionUID = -1895174013651345407L; private final CouponTypeEnum errorCode; private String primaryErrorCode; private String primaryErrorMsg; private String primaryErrorIP; public BusinessException(CouponTypeEnum errorCode) { this(errorCode, errorCode.getCouponTypeDesc()); } public BusinessException(CouponTypeEnum errorCode, String message) { super(message); this.errorCode = errorCode; } public BusinessException(CouponTypeEnum errorCode, String message,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) { super(message); this.errorCode = errorCode; this.primaryErrorCode=primaryErrorCode; this.primaryErrorMsg=primaryErrorMsg; this.primaryErrorIP=primaryErrorIP; } public BusinessException(CouponTypeEnum errorCode,String primaryErrorCode,String primaryErrorMsg,String primaryErrorIP) { this(errorCode, errorCode.getCouponTypeDesc()); this.primaryErrorCode=primaryErrorCode; this.primaryErrorMsg=primaryErrorMsg; this.primaryErrorIP=primaryErrorIP; }}

GlobalExceptionHandler.class 攔截異常并統(tǒng)一處理

MissingServletRequestParameterException:必填項為null異常 HttpMessageNotReadableException:參數(shù)類型不匹配異常 MethodArgumentNotValidException:JSON校驗失敗異常(比如長度等) BusinessException:自定義的異常 Exception:其他異常

@RestControllerAdvice('com.luo.producer.controller')@Slf4jpublic class GlobalExceptionHandler { /** * 忽略參數(shù)異常處理器 * * @param e 忽略參數(shù)異常 * @return Response */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MissingServletRequestParameterException.class) public Response parameterMissingExceptionHandler(MissingServletRequestParameterException e) { log.error('', e); return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), '請求參數(shù) ' + e.getParameterName() + ' 不能為空'); } /** * 缺少請求體異常處理器 * * @param e 缺少請求體異常 * @return Response */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(HttpMessageNotReadableException.class) public Response parameterBodyMissingExceptionHandler(HttpMessageNotReadableException e) { log.error('', e); return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), '參數(shù)體不能為空'); } /** * 參數(shù)效驗異常處理器 * * @param e 參數(shù)驗證異常 * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public Response parameterExceptionHandler(MethodArgumentNotValidException e) { log.error('', e); // 獲取異常信息 BindingResult exceptions = e.getBindingResult(); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息 if (exceptions.hasErrors()) { List<ObjectError> errors = exceptions.getAllErrors(); if (!errors.isEmpty()) {// 這里列出了全部錯誤參數(shù),按正常邏輯,只需要第一條錯誤即可FieldError fieldError = (FieldError) errors.get(0);return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage()); } } return new Response(CouponTypeEnum.PARAMETER_ERROR); } /** * 自定義參數(shù)錯誤異常處理器 * * @param e 自定義參數(shù) * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler({BusinessException.class}) public Response paramExceptionHandler(BusinessException e) { log.error('', e); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息 if (!StringUtils.isEmpty(e.getMessage())) { return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), e.getMessage()); } return new Response(CouponTypeEnum.PARAMETER_ERROR); } /** * 其他異常 * * @param e * @return */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler({Exception.class}) public Response otherExceptionHandler(Exception e) { log.error('其他異常', e); // 判斷異常中是否有錯誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息 if (!StringUtils.isEmpty(e.getMessage())) { return new Response(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage()); } return new Response(CouponTypeEnum.UNKNOWN_ERROR); }}

驗證

測試接口

@Valid被標(biāo)記的實體將會開啟一個校驗的功能

@RequestBody:請求實體需要加上@RequestBody否則MethodArgumentNotValidException異常將會被識別成Exception異常,提示信息將與預(yù)期不符。

@RestController@Slf4jpublic class UserController { @PostMapping('/helloluo') @MyPermissionTag(value = 'true') public String helloluo(@RequestBody @Valid UserPojoReq userPojoReq){ return 'Hello World”+userPojoReq; }}

模擬請求參數(shù),進行接口訪問:

SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例

到此這篇關(guān)于SpringBoot使用validation-api實現(xiàn)參數(shù)校驗的示例的文章就介紹到這了,更多相關(guān)SpringBoot validation參數(shù)校驗內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 亚洲一区免费在线观看 | 亚洲日本在线观看网址 | 性刺激欧美三级在线现看中文 | 一级特黄aaa大片 | 欧美一级看片免费观看视频在线 | 欧美日韩亚洲成色二本道三区 | 精品国产免费观看 | 国产女厕偷窥系列在线视频 | 一区二区三区欧美日韩国产 | 一区二区三区不卡视频 | 伊人久久大香线焦综合四虎 | 男人的天堂久久爱 | 日韩国产成人精品视频人 | 538prom精品视频在放免费 | 黄在线网站 | 成人久久伊人精品伊人 | 91高端极品外围在线观看 | 亚洲乱人伦精品图片 | 最新国产精品自拍 | 毛片免费观看的视频在线 | 成人性一级视频在线观看 | 亚洲天堂网在线视频 | 欧美一二区视频 | 全免费a级毛片免费毛视频 全午夜免费一级毛片 | 99久久精品6在线播放 | 欧美大片a一级毛片视频 | 久久久亚洲国产精品主播 | 精品国产品国语在线不卡丶 | 亚洲成人综合视频 | 日韩欧美国产高清在线观看 | 老师张开腿让我爽了一夜视频 | 午夜在线亚洲男人午在线 | 9l国产精品久久久久麻豆 | 一级欧美毛片成人 | 黄色作爱视频 | 97在线视频免费公开观看 | 九色视频在线观看免费 | 欧美精品久久 | 欧美最爽乱淫视频播放黑人 | 久久精品国产亚洲a | 亚洲国产一区二区三区最新 |