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

您的位置:首頁技術文章
文章詳情頁

Spring-Validation 后端數據校驗的實現

瀏覽:67日期:2023-08-28 10:28:44

前言

最近看到很多童鞋在項目中的對請求參數的校驗都用的if來判斷各參數的屬性,如:

if(StringUtils.isBlank(username)){ return RR.exception('賬號不能為空');}if(StringUtils.isBlank(password)){ return RR.exception('密碼不能為空');}if(StringUtils.isBlank(realName)){ return RR.exception('姓名不能為空');}......

每個參數都需要這樣一個個去校驗null,返回對應信息,代碼就像疊羅漢一樣~~,在此,樓主強烈推薦一個神器:Validation,有了它,再也不用這樣去校驗參數啦,可以讓我們在項目中不用太關注其他東西,專注于業務邏輯的編寫。

引入核心依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>

使用示例-添加用戶

需要校驗的實體類,在此使用了一些常用的校驗注解,基本上能夠見名知意,每個注解中都有message屬性,就是校驗不通過后的提示信息

@Data@AllArgsConstructor@NoArgsConstructor@ApiModel(value = 'Account', description = '用戶實體類')public class Account implements Serializable { private static final long serialVersionUID = -6310331730721778951L; private Long id; @NotBlank(message = '用戶名不能為空') @Length(max = 10, message = '用戶名最長為10位') private String name; @Pattern(regexp = PatternUtil.PASSWORDREGEX, message = '密碼為6-20位數字加字母組合') private String pwd; @NotBlank(message = '姓名不能為空') @Length(max = 8, message = '姓名最長為8位') private String realName; @Pattern(regexp = PatternUtil.PHONENOREGEX, message = '手機號碼格式不正確') private String phone; @NotNull(message = '用戶性別不能為空') @Max(value = 1,message = '性別 0:男 1:女') @Min(value = 0,message = '性別 0:男 1:女') private Integer sex; @NotNull(message = '用戶狀態不能為空') @Max(value = 1,message = '用戶狀態 0:啟用 1:禁用') @Min(value = 0,message = '用戶狀態 0:啟用 1:禁用') private Integer status; @Length(max = 200, message = '備注最長為200個字符') private String rmk;}

controller接口,注意在接收參數前需加上@Validated注解,這樣就會逐個去校驗實體類中需要加了校驗注解的的屬性,完全通過才進入下一步業務處理,否則拋出MethodArgumentNotValidException異常,在這里我們直接將異常拋出,交給全局異常處理類來處理。

@SysLog(menu = '用戶管理', function = '添加',filterParams = {'pwd','password','salt'})@PermissionCheck('account:manager:add')@PostMapping(value = '/add', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-添加用戶接口', notes = '用戶管理-添加用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated @RequestBody Account account) throws Exception { return RR.success('添加用戶成功');}

聲明全局異常處理類,處理所有異常,可以隨業務需要將異常種類細分,返回錯誤碼,返回提示信息可自由定義... 這里只需關注MethodArgumentNotValidException異常。

@RestControllerAdvicepublic class GlobalExceptionHandle { /** * @param e * @return * @Description 未知異常處理 */ @ExceptionHandler(Exception.class) public RR handleException(Exception e) { e.printStackTrace(); return RR.exception('系統異常,請聯系管理員'); } /** * @param e * @return * @Description 請求參數異常 */ @ExceptionHandler(MethodArgumentNotValidException.class) public RR handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { return RR.exception('請求參數錯誤:[' + e.getBindingResult().getFieldError().getDefaultMessage() + ']'); } /** * @param e * @return * @Description 系統業務服務異常 */ @ExceptionHandler(ServerException.class) public RR handleServerException(ServerException e) { return RR.exception(e.getMessage()); } /** * @param e * @return * @Description 令牌校驗異常 */ @ExceptionHandler(ExpireException.class) public RR handleExpireException(ExpireException e) { return RR.expire(e.getMessage()); } /** * @param e * @return * @Description 無權訪問異常 */ @ExceptionHandler(AccessDeniedException.class) public RR handleAccessDeniedException(AccessDeniedException e) { return RR.forbidden(e.getMessage()); } /** * @param e * @return * @Description 自定義重復操作異常 */ public RR handleRepeatHandleException(RepeatHandleException e) { return RR.exception('您的請求已發送,請勿重復操作!'); } /** * @param e * @return * @Description 登錄異常處理 */ @ExceptionHandler(AuthenticationException.class) public RR handleAuthenticationException(AuthenticationException e) { return RR.exception(e.getMessage()); }}

然后我們用Swagger來測試一下接口

1.用戶名為空

Spring-Validation 后端數據校驗的實現

2.手機號格式錯誤

Spring-Validation 后端數據校驗的實現

通過返回結果可以看到,我們的校驗注解已經幫我們按照指定的校驗方式校驗了指定的字段屬性,我們在統一的全局異常處理類中將提示信息封裝成需要的返回結果就可以了。

分組校驗

有的童鞋在此可能有疑問了,上述方法雖然可行,但我在新增用戶和修改用戶兩個接口中,新增用戶的用戶id是自動生成的,無需校驗;修改用戶的用戶id是必傳的,則需校驗。在此業務場景中,那豈不是需要聲明兩個實體類,但這兩個實體類中的屬性又大致相同,這不是增加麻煩嗎?其實不然,在此我們可以用到 groups 屬性來解決此場景下的問題。

聲明分組

注意:在聲明分組的時候盡量加上 extend javax.validation.groups.Default 否則,在你聲明@Validated(Update.class)的時候,就會出現你在默認沒添加groups = {}的時候的校驗組@Email(message = '郵箱格式不對'),會不去校驗,因為默認的校驗組是groups = {Default.class}。

/** * 數據新增分組 */public interface Create extends Default {}/** * 數據更新分組 */public interface Update extends Default {}

校驗注解中添加分組,groups 為一個數組,可以添加多個分組

@NotNull(message = 'id不能為空' , groups = Update.class)private Long id;@NotBlank(message = '用戶名不能為空' , groups = {Create.class, Update.class})@Length(max = 10, message = '用戶名最長為10位')private String name;

修改Controller中的@Validated注解,聲明校驗分組

@PermissionCheck('account:manager:add')@PostMapping(value = '/add', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-添加用戶接口', notes = '用戶管理-添加用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR add(@Validated(Create.class) @RequestBody Account account) throws Exception { return RR.success('添加用戶成功');}@PermissionCheck('account:manager:edit')@PostMapping(value = '/edit', produces = BaseConsts.REQUEST_HEADERS_CONTENT_TYPE)@ApiOperation(value = '用戶管理-修改用戶接口', notes = '用戶管理-修改用戶接口', httpMethod = BaseConsts.REQUEST_METHOD, response = RR.class)public RR edit(@Validated(Update.class) @RequestBody Account account) throws Exception { return RR.success('編輯用戶成功');}

使用相同的請求參數測試一下添加用戶和修改用戶的接口

測試添加接口

Spring-Validation 后端數據校驗的實現

測試修改接口

Spring-Validation 后端數據校驗的實現

通過接口的返回結果可以看到,新增用戶的接口并沒有校驗id這個參數了,而修改用戶的接口中則校驗了id不能為空。

常用校驗注解

以上就是樓主在項目中使用validation的總結歸納,下面收集了一些常用注解,紅色的標注則是樓主在項目中用的比較多的。

JSR提供的校驗注解: @Null 被注釋的元素必須為 null @NotNull 被注釋的元素必須不為 null @AssertTrue 被注釋的元素必須為 true @AssertFalse 被注釋的元素必須為 false @Min(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值 @Max(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值 @DecimalMin(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值 @DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值 @Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內 @Digits (integer, fraction) 被注釋的元素必須是一個數字,其值必須在可接受的范圍內 @Past 被注釋的元素必須是一個過去的日期 @Future 被注釋的元素必須是一個將來的日期 @Pattern(regex) 被注釋的元素必須符合指定的正則表達式

Hibernate Validator提供的校驗注解: @NotBlank() 驗證字符串非null且非空格,長度必須大于0 @Email 被注釋的元素必須是電子郵箱地址 @Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內 @NotEmpty 被注釋的字符串的必須非空 @Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內

參考博文: https://www.jb51.net/article/157604.htm

到此這篇關于Spring-Validation 后端數據校驗的實現的文章就介紹到這了,更多相關Spring Validation數據校驗內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 河南中专学校|职高|技校招生-河南中职中专网 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 不锈钢钢格栅板_热浸锌钢格板_镀锌钢格栅板_钢格栅盖板-格美瑞 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | C形臂_动态平板DR_动态平板胃肠机生产厂家制造商-普爱医疗 | 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 陕西视频监控,智能安防监控,安防系统-西安鑫安5A安防工程公司 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 北京软件开发_软件开发公司_北京软件公司-北京宜天信达软件开发公司 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 直线模组_滚珠丝杆滑台_模组滑台厂家_万里疆科技 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 | 检验科改造施工_DSA手术室净化_导管室装修_成都特殊科室建设厂家_医疗净化工程公司_四川华锐 | 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 橡胶接头_橡胶软接头_套管伸缩器_管道伸缩器厂家-巩义市远大供水材料有限公司 | 派财经_聚焦数字经济内容服务平台| 建筑资质代办-建筑资质转让找上海国信启航 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 屏蔽泵厂家,化工屏蔽泵_维修-淄博泵业 | 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | LOGO设计_品牌设计_VI设计 - 特创易 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 刮板输送机,粉尘加湿搅拌机,螺旋输送机,布袋除尘器 | 会议会展活动拍摄_年会庆典演出跟拍_摄影摄像直播-艾木传媒 |