电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

正文

ValidationApi框架就是用來(lái)解決參數(shù)校驗(yàn)中代碼冗余問(wèn)題,ValidationApi框架提供一些注解用來(lái)幫助我們對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn):

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

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

注入依賴

<!--參數(shù)校驗(yàn)--><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請(qǐng)求封裝類

如果成員變量是其他對(duì)象實(shí)體,該變量必須加 @Valid,否則嵌套中的驗(yàn)證不生效

@Setter@Getter@ToString@ApiModel('用戶對(duì)象')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 = '用戶姓名為必填項(xiàng),不得為空') @Size(min = 2,max = 20,message = '用戶名長(zhǎng)度要在2—8個(gè)字符') private String name; @ApiModelProperty(required = true, notes = '消息', example = '消息') private String msg;}

CouponTypeEnum.class :錯(cuò)誤碼枚舉類

@Getterpublic enum CouponTypeEnum { PARAMETER_ERROR(1001, '請(qǐng)求參數(shù)有誤!'), UNKNOWN_ERROR(9999, '未知的錯(cuò)誤!”); /** * 狀態(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:必填項(xiàng)為null異常 HttpMessageNotReadableException:參數(shù)類型不匹配異常 MethodArgumentNotValidException:JSON校驗(yàn)失敗異常(比如長(zhǎng)度等) 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(), '請(qǐng)求參數(shù) ' + e.getParameterName() + ' 不能為空'); } /** * 缺少請(qǐng)求體異常處理器 * * @param e 缺少請(qǐng)求體異常 * @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ù)效驗(yàn)異常處理器 * * @param e 參數(shù)驗(yàn)證異常 * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(MethodArgumentNotValidException.class) public Response parameterExceptionHandler(MethodArgumentNotValidException e) { log.error('', e); // 獲取異常信息 BindingResult exceptions = e.getBindingResult(); // 判斷異常中是否有錯(cuò)誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息 if (exceptions.hasErrors()) { List<ObjectError> errors = exceptions.getAllErrors(); if (!errors.isEmpty()) {// 這里列出了全部錯(cuò)誤參數(shù),按正常邏輯,只需要第一條錯(cuò)誤即可FieldError fieldError = (FieldError) errors.get(0);return new Response(CouponTypeEnum.PARAMETER_ERROR.getcouponTypeStr(), fieldError.getDefaultMessage()); } } return new Response(CouponTypeEnum.PARAMETER_ERROR); } /** * 自定義參數(shù)錯(cuò)誤異常處理器 * * @param e 自定義參數(shù) * @return ResponseInfo */ @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler({BusinessException.class}) public Response paramExceptionHandler(BusinessException e) { log.error('', e); // 判斷異常中是否有錯(cuò)誤信息,如果存在就使用異常中的消息,否則使用默認(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); // 判斷異常中是否有錯(cuò)誤信息,如果存在就使用異常中的消息,否則使用默認(rèn)消息 if (!StringUtils.isEmpty(e.getMessage())) { return new Response(CouponTypeEnum.UNKNOWN_ERROR.getcouponTypeStr(), e.getMessage()); } return new Response(CouponTypeEnum.UNKNOWN_ERROR); }}

驗(yàn)證

測(cè)試接口

@Valid被標(biāo)記的實(shí)體將會(huì)開(kāi)啟一個(gè)校驗(yàn)的功能

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

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

模擬請(qǐng)求參數(shù),進(jìn)行接口訪問(wèn):

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

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

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 蔬菜配送公司|蔬菜配送中心|食材配送|饭堂配送|食堂配送-首宏公司 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 南京交通事故律师-专打交通事故的南京律师 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 圆周直径尺-小孔内视镜-纤维研磨刷-东莞市高腾达精密工具 | 搪玻璃冷凝器_厂家-越宏化工设备| 方源木业官网-四川木门-全国木门专业品牌 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 免费B2B信息推广发布平台 - 推发网| 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 阁楼货架_阁楼平台_仓库仓储设备_重型货架_广州金铁牛货架厂 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 宝宝药浴-产后药浴-药浴加盟-艾裕-专注母婴调养泡浴 | 自动焊锡机_点胶机_螺丝机-锐驰机器人 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 聚氨酯复合板保温板厂家_廊坊华宇创新科技有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 |