最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中校驗(yàn)器(Validator)的深入講解

 更新時(shí)間:2018年06月13日 09:46:44   作者:Real_man  
Spring校驗(yàn)器,參數(shù)校驗(yàn)從此簡(jiǎn)單。下面這篇文章主要給大家介紹了關(guān)于Spring中校驗(yàn)器(Validator)的相關(guān)資料,文中通過(guò)示例代碼介紹非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

Spring框架的 validator 組件,是個(gè)輔助組件,在進(jìn)行數(shù)據(jù)的完整性和有效性非常有用,通過(guò)定義一個(gè)某個(gè)驗(yàn)證器,即可在其它需要的地方,使用即可,非常通用。


應(yīng)用在執(zhí)行業(yè)務(wù)邏輯之前,必須通過(guò)校驗(yàn)保證接受到的輸入數(shù)據(jù)是合法正確的,但很多時(shí)候同樣的校驗(yàn)出現(xiàn)了多次,在不同的層,不同的方法上,導(dǎo)致代碼冗余,浪費(fèi)時(shí)間,違反DRY原則。

  • 每一個(gè)控制器都要校驗(yàn)
  • 過(guò)多的校驗(yàn)參數(shù)會(huì)導(dǎo)致代碼太長(zhǎng)
  • 代碼的復(fù)用率太差,同樣的代碼如果出現(xiàn)多次,在業(yè)務(wù)越來(lái)越復(fù)雜的情況下,維護(hù)成本呈指數(shù)上升。

可以考慮把校驗(yàn)的代碼封裝起來(lái),來(lái)解決出現(xiàn)的這些問(wèn)題。

JSR-303

JSR-303是Java為Bean數(shù)據(jù)合法性校驗(yàn)提供的標(biāo)準(zhǔn)框架,它定義了一套可標(biāo)注在成員變量,屬性方法上的校驗(yàn)注解。
Hibernate Validation提供了這套標(biāo)準(zhǔn)的實(shí)現(xiàn),在我們引入Spring Boot web starter或者Spring boot starter validation的時(shí)候,默認(rèn)會(huì)引入Hibernate Validation。

用法實(shí)例

說(shuō)了這么多廢話(huà),上代碼。

1、引入SpringBoot項(xiàng)目

 <dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
 </dependency>
 <!-- 引入lomhok --> 
 <dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
 </dependency> 

2、編寫(xiě)校驗(yàn)對(duì)象

@Data
public class User {
 // 名字不允許為空,并且名字的長(zhǎng)度在2位到30位之間
 // 如果名字的長(zhǎng)度校驗(yàn)不通過(guò),那么提示錯(cuò)誤信息
 @NotNull
 @Size(min=2, max=30,message = "請(qǐng)檢查名字的長(zhǎng)度是否有問(wèn)題")
 private String name;

 // 不允許為空,并且年齡的最小值為18
 @NotNull
 @Min(18)
 private Integer age;
}

3、創(chuàng)建控制器

@SpringBootApplication
@RestController
public class UserApplication{
 public static void main(String[] args) {
 SpringApplication.run(UserApplication.class,args);
 }
 
 // 1. 要校驗(yàn)的參數(shù)前,加上@Valid注解
 // 2. 緊隨其后的,跟上一個(gè)BindingResult來(lái)存儲(chǔ)校驗(yàn)信息
 @RequestMapping("/test1")
 public Object test1(
  @Valid User user,
  BindingResult bindingResult
 ) {
 //如果檢驗(yàn)出了問(wèn)題,就返回錯(cuò)誤信息
 // 這里我們返回的是全部的錯(cuò)誤信息,實(shí)際中可根據(jù)bindingResult的方法根據(jù)需要返回自定義的信息。
 // 通常的解決方案為:JSR-303 + 全局ExceptionHandler
 if (bindingResult.hasErrors()){
  return bindingResult.getAllErrors();
 }
 return "OK";
 } 
}

4、運(yùn)行應(yīng)用

稍作演示下運(yùn)行的結(jié)果,可以看出校驗(yàn)框架已經(jīng)生效了。


校驗(yàn)?zāi)挲g

校驗(yàn)名稱(chēng)

校驗(yàn)通過(guò)

常見(jiàn)的校驗(yàn)注解

@Null 被注釋的元素必須為 null

@NotNull 被注釋的元素必須不為 null

@AssertTrue 被注釋的元素必須為 true

@AssertFalse 被注釋的元素必須為 false

@Min(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值

@Max(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值

@DecimalMin(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值

@DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值

@Size(max=, min=) 被注釋的元素的大小必須在指定的范圍內(nèi)

@Digits (integer, fraction) 被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)

@Past 被注釋的元素必須是一個(gè)過(guò)去的日期

@Future 被注釋的元素必須是一個(gè)將來(lái)的日期

@Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達(dá)式

Hibernate Validator提供的校驗(yàn)注解:

@NotBlank(message =) 驗(yàn)證字符串非null,且長(zhǎng)度必須大于0

@Email 被注釋的元素必須是電子郵箱地址

@Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)

@NotEmpty 被注釋的字符串的必須非空

@Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)

自定義校驗(yàn)注解

有時(shí)候,第三方庫(kù)中并沒(méi)有我們想要的校驗(yàn)類(lèi)型,好在系統(tǒng)提供了很好的擴(kuò)展能力,我們可以自定義檢驗(yàn)。
比如,我們想校驗(yàn)用戶(hù)的手機(jī)格式,寫(xiě)手機(jī)號(hào)碼校驗(yàn)器

1、編寫(xiě)校驗(yàn)注解

// 我們可以直接拷貝系統(tǒng)內(nèi)的注解如@Min,復(fù)制到我們新的注解中,然后根據(jù)需要修改。
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
//注解的實(shí)現(xiàn)類(lèi)。
@Constraint(validatedBy = {IsMobileValidator.class})
public @interface IsMobile {
 //校驗(yàn)錯(cuò)誤的默認(rèn)信息
 String message() default "手機(jī)號(hào)碼格式有問(wèn)題";
 //是否強(qiáng)制校驗(yàn)
 boolean isRequired() default false;
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
}

2、編寫(xiě)具體的實(shí)現(xiàn)類(lèi)

我們知道注解只是一個(gè)標(biāo)記,真正的邏輯還要在特定的類(lèi)中實(shí)現(xiàn),上一步的注解指定了實(shí)現(xiàn)校驗(yàn)功能的類(lèi)為IsMobileValidator。

// 自定義注解一定要實(shí)現(xiàn)ConstraintValidator接口奧,里面的兩個(gè)參數(shù)
// 第一個(gè)為 具體要校驗(yàn)的注解
// 第二個(gè)為 校驗(yàn)的參數(shù)類(lèi)型
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {

 private boolean required = false;

 private static final Pattern mobile_pattern = Pattern.compile("1\\d{10}");
 //工具方法,判斷是否是手機(jī)號(hào)
 public static boolean isMobile(String src) {
  if (StringUtils.isEmpty(src)) {
   return false;
  }
  Matcher m = mobile_pattern.matcher(src);
  return m.matches();
 }

 @Override
 public void initialize(IsMobile constraintAnnotation) {
  required = constraintAnnotation.isRequired();
 }

 @Override
 public boolean isValid(String phone, ConstraintValidatorContext constraintValidatorContext) {
  //是否為手機(jī)號(hào)的實(shí)現(xiàn)
  if (required) {
   return isMobile(phone);
  } else {
   if (StringUtils.isEmpty(phone)) {
    return true;
   } else {
    return isMobile(phone);
   }
  }
 }
}

3、測(cè)試自定義注解的功能

@Data
public class User {
 @NotNull
 @Size(min=2, max=30,message = "請(qǐng)檢查名字的長(zhǎng)度是否有問(wèn)題")
 private String name;
 @NotNull
 @Min(18)
 private Integer age;
 //這里是新添加的注解奧
 @IsMobile
 private String phone;
}

4、測(cè)試

通過(guò)

手機(jī)號(hào)有問(wèn)題

可以看出自定義的注解已經(jīng)生效了。

我們還可以繼續(xù)優(yōu)化的地方,新建一個(gè)全局的異常,如果校驗(yàn)失敗的話(huà),拋出全局的業(yè)務(wù)異常,捕獲業(yè)務(wù)異常,然后返回用戶(hù)友好的提示信息。

額外

也可以通過(guò)方法的校驗(yàn)。

1、控制器上添加@Validated注解

2、在控制器的方法上添加校驗(yàn)注解,@Min,@Max等。

@Validated
@RestController
@SpringBootApplication
public class UserApplication{
 public static void main(String[] args) {
  SpringApplication.run(UserApplication.class,args);
 }

 @RequestMapping("/test2")
 public String test2(
   @IsMobile String phone

 ){
  return phone + "ok";
 }

 @ExceptionHandler(ConstraintViolationException.class)
 @ResponseBody
 public Object handleConstraintViolationException(ConstraintViolationException cve){

  HashSet<String> messageSet = new HashSet();
  for (ConstraintViolation constraintViolation : cve.getConstraintViolations()) {
   messageSet.add(constraintViolation.getMessage());
  }
  return messageSet;
 }
}

類(lèi)的校驗(yàn)規(guī)則

最后

通過(guò)使用校驗(yàn)器,所有的控制器,我們都不用再去做校驗(yàn)啦,代碼再回看是不是清爽很多。我們寫(xiě)代碼很簡(jiǎn)答,但是一定要想到如何把代碼寫(xiě)的更簡(jiǎn)單,更清晰,更利于維護(hù),寫(xiě)重復(fù)的代碼是在浪費(fèi)自己的時(shí)間奧。

以后再碰到參數(shù)校驗(yàn)的情況,首先想到的不是直接就去校驗(yàn),可以查找自己是否寫(xiě)過(guò)某一類(lèi)的驗(yàn)證器,可以直接拿來(lái)即用。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java如何配置IDEA自定義注釋

    Java如何配置IDEA自定義注釋

    在IDEA中設(shè)置自動(dòng)創(chuàng)建類(lèi)和方法的注釋可以提高編碼效率,確保代碼的一致性和可讀性,首先,對(duì)于創(chuàng)建類(lèi)的注釋,可以通過(guò)修改File→Settings→File and Code Templates→Class的模板來(lái)實(shí)現(xiàn),其次,對(duì)于方法注釋
    2024-10-10
  • SpringCloud Feign 服務(wù)調(diào)用的實(shí)現(xiàn)

    SpringCloud Feign 服務(wù)調(diào)用的實(shí)現(xiàn)

    Feign是一個(gè)聲明性web服務(wù)客戶(hù)端。本文記錄多個(gè)服務(wù)之間使用Feign調(diào)用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql

    spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql

    這篇文章主要為大家詳細(xì)介紹了spring boot整合mybatis使用c3p0數(shù)據(jù)源連接mysql,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java過(guò)濾器@WebFilter用法詳解

    Java過(guò)濾器@WebFilter用法詳解

    @WebFilter用于將一個(gè)類(lèi)聲明為過(guò)濾器,該注解將會(huì)在部署時(shí)被容器處理,容器將根據(jù)具體的屬性配置將相應(yīng)的類(lèi)部署為過(guò)濾器,這篇文章主要給大家介紹了關(guān)于Java過(guò)濾器@WebFilter用法的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring Cloud Hystrix入門(mén)和Hystrix命令原理分析

    Spring Cloud Hystrix入門(mén)和Hystrix命令原理分析

    這篇文章主要介紹了Spring Cloud Hystrix入門(mén)和Hystrix命令原理分析,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • Java編程中使用JDBC API連接數(shù)據(jù)庫(kù)和創(chuàng)建程序的方法

    Java編程中使用JDBC API連接數(shù)據(jù)庫(kù)和創(chuàng)建程序的方法

    這篇文章主要介紹了Java編程中使用JDBC API連接數(shù)據(jù)庫(kù)和創(chuàng)建程序的基本教程,JDBC是一種用于執(zhí)行SQL語(yǔ)句的Java API,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn)需要的朋友可以參考下
    2015-12-12
  • java實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴的方法

    java實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴的方法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴的表達(dá)式方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘

    Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘

    這篇文章主要介紹了Java遞歸簡(jiǎn)單實(shí)現(xiàn)n的階乘,遞歸(recursion)就是子程序(或函數(shù))直接調(diào)用自己或通過(guò)一系列調(diào)用語(yǔ)句間接調(diào)用自己,是一種描述問(wèn)題和解決問(wèn)題的基本方法,下面我們舉一個(gè)小小的例子詳情了解一下,需要的朋友可以參考下
    2021-12-12
  • SpringBoot整合Swagger框架過(guò)程解析

    SpringBoot整合Swagger框架過(guò)程解析

    這篇文章主要介紹了SpringBoot整合Swagger框架過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java請(qǐng)求調(diào)用參數(shù)格式為form-data類(lèi)型的接口代碼示例

    Java請(qǐng)求調(diào)用參數(shù)格式為form-data類(lèi)型的接口代碼示例

    這篇文章主要給大家介紹了關(guān)于Java請(qǐng)求調(diào)用參數(shù)格式為form-data類(lèi)型的接口的相關(guān)資料,文中給出了詳細(xì)的代碼示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

抚宁县| 普兰店市| 措勤县| 织金县| 南乐县| 满城县| 朝阳市| 互助| 罗定市| 扶风县| 大港区| 牡丹江市| 长沙县| 铅山县| 东至县| 罗定市| 博罗县| 高淳县| 年辖:市辖区| 三台县| 酉阳| 莱阳市| 双柏县| 自治县| 遵义县| 石嘴山市| 连江县| 达孜县| 金川县| 镇巴县| 佛学| 伊宁市| 长泰县| 长阳| 甘孜| 东安县| 徐州市| 丰都县| 普兰店市| 凉山| 瑞安市|