hibernate-validator后端表單數(shù)據(jù)校驗的使用示例詳解
hibernate-validator后端表單數(shù)據(jù)校驗的使用
1、hibernate-validator介紹
早期的網(wǎng)站,用戶輸入一個郵箱地址,需要將郵箱地址發(fā)送到服務(wù)端,服務(wù)端進行校驗,校驗成功后,給前端一個響應(yīng)。
有了JavaScript后,校驗工作可以放在前端去執(zhí)行。那么為什么還需要服務(wù)端校驗?zāi)兀?因為前端傳來的數(shù)據(jù)不可信。前端很容易獲取到后端的接口,如果有人直接調(diào)用接口,就可能會出現(xiàn)非法數(shù)據(jù),所以服務(wù)端也要數(shù)據(jù)校驗。
總的來說:
- 前端校驗:主要是提高用戶體驗
- 后端校驗:主要是保證數(shù)據(jù)安全可靠
校驗參數(shù)基本上是一個體力活,而且冗余代碼繁多,也影響代碼的可讀性,我們需要一個比較優(yōu)雅的方式來解決這個問題。Hibernate Validator 框架剛好解決了這個問題,可以以很優(yōu)雅的方式實現(xiàn)參數(shù)的校驗,讓業(yè)務(wù)代碼和校驗邏輯分開,不再編寫重復(fù)的校驗邏輯。
hibernate-validator優(yōu)勢:
- 驗證邏輯與業(yè)務(wù)邏輯之間進行了分離,降低了程序耦合度
- 統(tǒng)一且規(guī)范的驗證方式,無需你再次編寫重復(fù)的驗證代碼
- 你將更專注于你的業(yè)務(wù),將這些繁瑣的事情統(tǒng)統(tǒng)丟在一邊
hibernate-validator的maven坐標(biāo):
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.18.Final</version> </dependency>
提示:spring-boot-starter-web中已經(jīng)依賴了hibernate-validator
2、hibernate-validator常用注解
hibernate-validator提供的校驗方式為在類的屬性上加入相應(yīng)的注解來達到校驗的目的。hibernate-validator提供的用于校驗的注解如下:
注解 | 說明 |
---|---|
@AssertTrue | 用于boolean字段,該字段只能為true |
@AssertFalse | 用于boolean字段,該字段只能為false |
@CreditCardNumber | 對信用卡號進行一個大致的驗證 |
@DecimalMax | 只能小于或等于該值 |
@DecimalMin | 只能大于或等于該值 |
檢查是否是一個有效的email地址 | |
@Future | 檢查該字段的日期是否是屬于將來的日期 |
@Length(min=,max=) | 檢查所屬的字段的長度是否在min和max之間,只能用于字符串 |
@Max | 該字段的值只能小于或等于該值 |
@Min | 該字段的值只能大于或等于該值 |
@NotNull | 不能為null |
@NotBlank | 不能為空,檢查時會將空格忽略 |
@NotEmpty | 不能為空,這里的空是指空字符串 |
@Pattern(regex=) | 被注釋的元素必須符合指定的正則表達式 |
@URL(protocol=,host,port) | 檢查是否是一個有效的URL,如果提供了protocol,host等,則該URL還需滿足提供的條件 |
3、 hibernate-validator入門案例
3.1、第一步:創(chuàng)建maven工程hibernate-validator_demo并配置pom.xml文件
spring-boot-starter-web中已經(jīng)依賴了hibernate-validator
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath/> </parent> <groupId>org.example</groupId> <artifactId>hibernate-validator_demo</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!--spring-boot-starter-web中已經(jīng)依賴了hibernate-validator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.18.Final</version> </dependency> --> </dependencies> </project>
3.2、創(chuàng)建實體類
NotEmpty:不能為空字符串
package com.zcl.entity; import lombok.Data; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.*; /** * 項目名稱:hibernate-validator_demo * 描述:用戶實體類 * * @author zhong * @date 2022-08-29 12:48 */ @Data public class User { @NotNull(message = "用戶id不能為空") private Integer id; @NotEmpty(message = "用戶名不能為空") @Length(max = 50, message = "用戶名長度不能超過50") private String username; @Max(value = 80,message = "年齡最大為80") @Min(value = 18,message = "年齡最小為18") private int age; @Pattern(regexp = "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", message = "郵箱格式不正確") private String email; }
3.3、創(chuàng)建UserController
package com.zcl.controller; import com.zcl.entity.User; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.validation.constraints.NotBlank; /** * 項目名稱:hibernate-validator_demo * 描述:用戶控制器 * * @author zhong * @date 2022-08-29 12:53 */ @RestController @RequestMapping("/user") @Validated public class UserController { /** * 簡單數(shù)據(jù)類型校驗 * @param id * @return */ @RequestMapping("/delete") public String delete(@NotBlank(message = "id不能為空") String id){ System.out.println("delete..." + id); return "OK"; } /** * 對象屬性校驗 * @param user * @return */ @RequestMapping("/save") public String save(@RequestBody @Validated User user){ System.out.println("save..." + user); return "OK"; } }
3.4、創(chuàng)建項目啟動類
package com.zcl; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 項目名稱:hibernate-validator_demo * 描述:項目啟動類 * * @author zhong * @date 2022-08-29 13:04 */ @SpringBootApplication public class HibernateValidatorApp { public static void main(String[] args) { SpringApplication.run(HibernateValidatorApp.class, args); } }
3.5、創(chuàng)建application.yml配置文件
該配置文件可有可無
server: port: 8080
4、啟動項目測試
使用測試工具或插件進行訪問:http://localhost:8080/user/delete
4.1、刪除控制器沒有攜帶數(shù)據(jù)
當(dāng)id為空的時候會直接報錯響應(yīng)到前端頁面
4.2、刪除控制器攜帶id時
4.2、訪問對象屬性校驗不攜帶數(shù)據(jù)時
提示有三個報錯信息
IDEA控制臺查看
4.3、訪問對象屬性校驗攜帶數(shù)據(jù)時
5、處理異常信息
在
config
包下創(chuàng)建全局的異常處理器,全局捕獲@RestController
或@Controller
的注解控制器
package com.zcl.config; import org.springframework.stereotype.Controller; import org.springframework.validation.BindException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.Set; /** * 項目名稱:hibernate-validator_demo * 描述:全局的異常處理 * * @author zhong * @date 2022-08-29 13:17 */ @ControllerAdvice(annotations = {RestController.class, Controller.class}) @ResponseBody public class ExceptionConfiguration { // 定義只捕獲著兩種異常 @ExceptionHandler({ConstraintViolationException.class, BindException.class}) public String validateException(Exception ex, HttpServletRequest request) { ex.printStackTrace(); String msg = null; if(ex instanceof ConstraintViolationException){ // 異常信息強轉(zhuǎn) ConstraintViolationException constraintViolationException = (ConstraintViolationException)ex; // 獲取異常信息 Set<ConstraintViolation<?>> violations = constraintViolationException.getConstraintViolations(); ConstraintViolation<?> next = violations.iterator().next(); msg = next.getMessage(); }else if(ex instanceof BindException){ BindException bindException = (BindException)ex; msg = bindException.getBindingResult().getFieldError().getDefaultMessage(); } return msg; } }
6、重新啟動項目測試
注意:當(dāng)我們的請求【http://localhost:8080/user/save?id=1】控制器的時候,不是使用get請求或者路徑的方式提交參數(shù),后端的全局攔截代碼是捕獲不到異常信息的,返回的還是之前的直接錯誤顯示在前端的瀏覽器上。通過get請求以及路徑參數(shù)的方式提交就可以了
7、修改代碼,一次校驗不通過就不再執(zhí)行
創(chuàng)建ValidatorConfiguration類,指定校驗時使用快速失敗返回模式
package com.zcl.config; import org.hibernate.validator.HibernateValidator; import org.springframework.context.annotation.Bean; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; /** * 項目名稱:hibernate-validator_demo * 描述:指定校驗時使用快速失敗返回模式 * * @author zhong * @date 2022-08-29 13:38 */ public class ValidatorConfiguration { @Bean public Validator validator() { ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class) .configure() //快速失敗返回模式 .addProperty("hibernate.validator.fail_fast", "true") .buildValidatorFactory(); return validatorFactory.getValidator(); } /** * 開啟快速返回 * 如果參數(shù)校驗有異常,直接拋異常,不會進入到 controller,使用全局異常攔截進行攔截 */ @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor(); /**設(shè)置validator模式為快速失敗返回*/ postProcessor.setValidator(validator()); return postProcessor; } }
注意:上面創(chuàng)建的類并不是配置類,所以到目前為止快速失敗返回模式并不會生效,為了使其生效需要創(chuàng)建一個注解用于控制此模式的開啟
8、創(chuàng)建注解EnableFormValidator用于控制快速失敗返回模式的開啟
package com.zcl.config; import org.springframework.context.annotation.Import; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 項目名稱:hibernate-validator_demo * 描述:在啟動類上添加該注解來啟動表單驗證功能---快速失敗返回模式 * * @author zhong * @date 2022-08-29 13:41 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(ValidatorConfiguration.class) public @interface EnableFormValidator { }
在啟動類上加上上面的注解
package com.zcl; import com.zcl.config.EnableFormValidator; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 項目名稱:hibernate-validator_demo * 描述:項目啟動類 * * @author zhong * @date 2022-08-29 13:04 */ @SpringBootApplication @EnableFormValidator public class HibernateValidatorApp { public static void main(String[] args) { SpringApplication.run(HibernateValidatorApp.class, args); } }
再次啟動項目的時候通過測試對象屬性,少傳遞兩個參數(shù)集合看出效果,當(dāng)前面的驗證不通過的時候后面的就不會再次驗證了
到此這篇關(guān)于hibernate-validator后端表單數(shù)據(jù)校驗的使用的文章就介紹到這了,更多相關(guān)hibernate-validator數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?hystrix斷路器與全局解耦全面介紹
什么是服務(wù)降級?當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)實際業(yè)務(wù)情況及流量,對一些服務(wù)和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務(wù)器資源以保證核心交易正常運作或高效運作2022-10-10Java常見基本數(shù)據(jù)結(jié)構(gòu)概覽
這篇文章主要介紹了Java常見的幾種基本數(shù)據(jù)結(jié)構(gòu),包括其含義和用法,,需要的朋友可以參考下2017-09-09SpringMVC九大組件之HandlerMapping詳解
這篇文章主要介紹了SpringMVC九大組件之HandlerMapping詳解,HandlerMapping 叫做處理器映射器,它的作用就是根據(jù)當(dāng)前 request 找到對應(yīng)的 Handler 和 Interceptor,然后封裝成一個 HandlerExecutionChain 對象返回,需要的朋友可以參考下2023-09-09SpringSecurity OAuth2單點登錄和登出的實現(xiàn)
本文主要介紹了SpringSecurity OAuth2單點登錄和登出的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02@Controller、@RestController注解區(qū)別詳解
這篇文章主要介紹了@Controller、@RestController注解區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10