欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC中常用參數(shù)校驗(yàn)類注解使用示例教程

 更新時(shí)間:2022年03月23日 14:40:26   作者:KimZing  
這篇文章主要介紹了SpringMVC中常用參數(shù)校驗(yàn)類注解使用示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、環(huán)境準(zhǔn)備

在項(xiàng)目中添加以下依賴

gradle

org.hibernate:hibernate-validator:5.3.5.Final

maven

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.5.Final</version>
</dependency>

如果是SpringBoot項(xiàng)目,只需要引入web的starter即可,里面包含了所需依賴

二、常用的校驗(yàn)注解及示例

public class UserDTO {
    //不顯示地址
    public interface CommonView {}
    //顯示地址
    public interface AdminView extends commonView {}
    @JsonView(value = CommonView.class)
    private String username;
    @JsonView(value = AdminView.class )
    private String address;
    //Getter Setter ...
}    //該參數(shù)必須為空
    @Null(message = "無需ID")
    private Integer id;
    //根據(jù)正則校驗(yàn)手機(jī)號(hào)是否是由數(shù)字組成
    @Pattern(regexp = "^\\d{11}$", message = "手機(jī)格式不正確,不是11位")
    private String telephone;
    //校驗(yàn)該對(duì)象是否為null
    //對(duì)于String來說,空字符串可通過校驗(yàn),所以String應(yīng)該使用@NotBlank進(jìn)行校驗(yàn),此處僅做示例而已。
    @NotNull(message = "聯(lián)系人不能為空")
    private String friendName;
    //校驗(yàn)對(duì)象是否是空對(duì)象,可用于Array,Collection,Map,String
    @NotEmpty(message = "家庭成員不能為空")
    private List families;
    //校驗(yàn)長(zhǎng)度,可以用于Array,Collection,Map,String
    @Size(min = 4, max = 8, message = "用戶名長(zhǎng)度錯(cuò)誤 by size")
    //校驗(yàn)長(zhǎng)度,只能用于String
    @Length(min = 4, max = 8, message = "用戶名長(zhǎng)度錯(cuò)誤 by length")
    private String username;
    //javax校驗(yàn)
    @Max(value = 200, message = "年齡一般不會(huì)超過200 by max")
    @Min(value = 1, message = "年齡一般不能小于1 by min")
    //hibernate校驗(yàn),效果等同
    @Range(min = 0, max = 200, message = "年齡范圍在0-200之間 by range")
    private Integer age;
    //校驗(yàn)參數(shù)是否是False, 相反的是@AssertTrue
    @AssertFalse(message = "用戶初始化無需凍結(jié)")
    private Boolean lock;
    //String專用
    @NotBlank(message = "密碼不能為空")
    @Size(min = 6, max = 12, message = "密碼長(zhǎng)度不對(duì)")
    private String password;
    //使用自定義校驗(yàn)注解->校驗(yàn)時(shí)間
    @Past(message = "生日只能為以前的時(shí)間")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date birth;
    //校驗(yàn)Email
    @Email(message = "郵件地址不正確")
    private String email;

三、校驗(yàn)類方法中的普通參數(shù)

在類上加@Validated注解

在參數(shù)上加上校驗(yàn)注解

以controller層作示例如下:

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 校驗(yàn)請(qǐng)求參數(shù)
     */
    @GetMapping
    public String getUser(@Size(min = 5, max = 8, message = "用戶名長(zhǎng)度超出限制") String username) {
	 return username;       
    }
}

四、校驗(yàn)類方法中的自定義對(duì)象

在類上加@Validated注解(同普通參數(shù)一樣都需要加)

在參數(shù)上加@Valid,(或者加@Validated也是可以的)

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 校驗(yàn)請(qǐng)求中的自定義對(duì)象
     */
    @PostMapping
    public UserDTO saveUserOuter(@RequestBody @Valid UserDTO userDTO) {
        return userDTO;
    }

}

3.在自定義對(duì)象中的屬性上加上校驗(yàn)注解

public class UserDTO {
    //該參數(shù)必須為空
    @Null(message = "無需ID")
    private Integer id;
    //根據(jù)正則校驗(yàn)手機(jī)號(hào)是否是由數(shù)字組成
    @Pattern(regexp = "^\\d{11}$", message = "手機(jī)格式不正確,不是11位")
    private String telephone;
    //校驗(yàn)該對(duì)象是否為null
    //對(duì)于String來說,空字符串可通過校驗(yàn),所以String應(yīng)該使用@NotBlank進(jìn)行校驗(yàn),此處僅做示例而已。
    @NotNull(message = "聯(lián)系人不能為空")
    private String friendName;
    //校驗(yàn)對(duì)象是否是空對(duì)象,可用于Array,Collection,Map,String
    @NotEmpty(message = "家庭成員不能為空")
    private List families;
    //校驗(yàn)長(zhǎng)度,可以用于Array,Collection,Map,String
    @Size(min = 4, max = 8, message = "用戶名長(zhǎng)度錯(cuò)誤 by size")
    //校驗(yàn)長(zhǎng)度,只能用于String
    @Length(min = 4, max = 8, message = "用戶名長(zhǎng)度錯(cuò)誤 by length")
    private String username;
    //javax校驗(yàn)
    @Max(value = 200, message = "年齡一般不會(huì)超過200 by max")
    @Min(value = 1, message = "年齡一般不能小于1 by min")
    //hibernate校驗(yàn),效果等同
    @Range(min = 0, max = 200, message = "年齡范圍在0-200之間 by range")
    private Integer age;
    //校驗(yàn)參數(shù)是否是False, 相反的是@AssertTrue
    @AssertFalse(message = "用戶初始化無需凍結(jié)")
    private Boolean lock;
    //String專用
    @NotBlank(message = "密碼不能為空")
    @Size(min = 6, max = 12, message = "密碼長(zhǎng)度不對(duì)")
    private String password;
    //使用自定義校驗(yàn)注解->校驗(yàn)時(shí)間
    @Past(message = "生日只能為以前的時(shí)間")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date birth;
    //校驗(yàn)Email
    @Email(message = "郵件地址不正確")
    private String email;
	//setter  getter ....
}

五、關(guān)于@Valid和@Validated的區(qū)別聯(lián)系

一直對(duì)@Valid和@Validated這兩個(gè)注解非常疑惑,不知道怎么區(qū)分和使用。

1.包位置

@Valid: javax.validation, 是javax,也是就是jsr303中定義的規(guī)范注解

@Validated: org.springframework.validation.annotation, 是spring自己封裝的注解。

2.功能
@Valid就不用說了,是jsr303的規(guī)范。我們打開@Validated的源碼,可以看到以下注釋,

Variant of JSR-303's {@link javax.validation.Valid}, supporting the
specification of validation groups. Designed for convenient use with
Spring's JSR-303 support but not JSR-303 specific.

大致意思就是說@Validated是@Valid的一個(gè)變種,擴(kuò)展了@Valid的功能,支持group分組校驗(yàn)的寫法。
那么我們對(duì)于@Valid和@Validated就可以這么理解:

能用@Valid的地方通??梢杂聾Validated替代。需要使用分組校驗(yàn)的時(shí)候使用@Validated注解。

六、分組校驗(yàn)

我們有一個(gè)用戶DTO,其中有id,username兩個(gè)屬性。當(dāng)保存時(shí),id不需要有值,由數(shù)據(jù)庫自動(dòng)生成,我們使用@Null注解校驗(yàn)。當(dāng)更新時(shí),id需要有值,根據(jù)ID去更新用戶名,我們使用@NotNull注解校驗(yàn)。無論是保存用戶還是更新用戶,都需要校驗(yàn)用戶名,我們使用@NotBlank注解校驗(yàn)。

UserGroupValidDTO

public class UserGroupValidDTO {
    public interface SaveGroup extends Default {}
    public interface UpdateGroup extends Default {}
    @Null(groups = {SaveGroup.class}, message = "不需要傳入用戶ID")
    @NotNull(groups = {UpdateGroup.class}, message = "用戶ID不能為空")
    private Integer id;
    @NotBlank(message = "用戶名不能為空")
    private String username;
    //Setter Getter ...
}

定義相應(yīng)類型的公開接口(SaveGroup,UpdateGroup),給每個(gè)校驗(yàn)注解指定groups屬性,如果不指定則默認(rèn)為javax.validation.groups.Default.class。

我們讓SaveGroup和UpdateGroup繼承了Default, 那么三個(gè)接口之間的關(guān)系類似如下:

save --> SaveGroup |-->id  @Null
                   |-->Default --> username @NotBlank
                   
update--> UpdateGroup |-->id @NotNull
                      |-->Default --> username @NotBlank

UserController

@Validated
@RestController
@RequestMapping(value = "/user")
public class UserController {
    /**
     * 分組校驗(yàn):保存用戶,不能傳ID
     */
    @PostMapping("/save")
    public void validSaveUser(@RequestBody @Validated(value = UserGroupValidDTO.SaveGroup.class) UserGroupValidDTO userDTO) {
        //save user
    }
    /**
     * 分組校驗(yàn):更新用戶信息,需要傳ID
     */
    @PostMapping("/update")
    public void validUpdateUser(@RequestBody @Validated(value = UserGroupValidDTO.UpdateGroup.class) UserGroupValidDTO userDTO) {
        //update user
    }

}

在方法參數(shù)的對(duì)象上加@Validated屬性,填寫Value為對(duì)應(yīng)的接口的class即可,這時(shí)候訪問不同的接口就會(huì)進(jìn)行不同的校驗(yàn)了。

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

有時(shí)候默認(rèn)提供的校驗(yàn)注解無法滿足我們的需要,我們需要自定義。例如現(xiàn)有校驗(yàn)注解不支持java8中的LocalDateTime。那么接下來我們自定義一個(gè)校驗(yàn)LocalDateTime的注解。該注解判斷傳入的時(shí)間是否是一個(gè)過去的時(shí)間。

1.創(chuàng)建校驗(yàn)注解

/**
 * @author kingboy--KingBoyWorld@163.com
 * @date 2017/12/29 下午7:24
 * @desc ${DESCRIPTION}.
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PastTimeValidate.class)
public @interface PastDate {
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

2.編寫校驗(yàn)規(guī)則

校驗(yàn)規(guī)則也就是枚舉PastDate中指定的validateBy屬性

/**
 * @author kingboy--KingBoyWorld@163.com
 * @date 2017/12/29 下午7:28
 * @desc .
 */
@CommonsLog
public class PastTimeValidate implements ConstraintValidator<PastDate, LocalDateTime> {
   @Override
   public void initialize(PastDate constraintAnnotation) {
      log.info("init enum PastDate");
   }
   @Override
   public boolean isValid(LocalDateTime localDateTime, ConstraintValidatorContext context) {
      return localDateTime.isBefore(LocalDateTime.now()) ? true : false;
   }
}

寫完這些,我們就可以像@Past對(duì)Date校驗(yàn)一樣使用@PastDate對(duì)LocalDateTime進(jìn)行校驗(yàn)了。

以上就是SpringMVC中常用參數(shù)校驗(yàn)類注解使用示例教程的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC中參數(shù)校驗(yàn)注解示例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis和Mybatis-Plus時(shí)間范圍查詢方式

    Mybatis和Mybatis-Plus時(shí)間范圍查詢方式

    這篇文章主要介紹了Mybatis和Mybatis-Plus時(shí)間范圍查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java命令執(zhí)行jar包的多種方法(四種方法)

    java命令執(zhí)行jar包的多種方法(四種方法)

    本文通過四種方法給大家介紹java命令執(zhí)行jar包的方式,每種方法通過實(shí)例代碼給大家詳解,需要的朋友參考下吧
    2019-11-11
  • pageHelper一對(duì)多分頁解決方案示例

    pageHelper一對(duì)多分頁解決方案示例

    這篇文章主要為大家介紹了pageHelper一對(duì)多分頁解決方案示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解

    Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解

    這篇文章主要介紹了Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程,連續(xù)結(jié)構(gòu)和跳轉(zhuǎn)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)中常見的兩種基本數(shù)據(jù)結(jié)構(gòu),而我們本次的主角棧和隊(duì)列都 既可以使用使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)也可以使用連續(xù)結(jié)構(gòu)實(shí)現(xiàn)
    2023-04-04
  • Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解

    Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解

    這篇文章主要介紹了Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例

    本文主要介紹了SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringCloud使用Feign文件上傳、下載

    SpringCloud使用Feign文件上傳、下載

    這篇文章主要為大家詳細(xì)介紹了SpringCloud使用Feign文件上傳、下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 了解SpringMVC的上傳和下載

    了解SpringMVC的上傳和下載

    今天小編就為大家分享一篇關(guān)于Spring整合Springmvc的相關(guān)介紹,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • 淺談Java8 判空新寫法

    淺談Java8 判空新寫法

    在開發(fā)過程中很多時(shí)候會(huì)遇到判空校驗(yàn),如果不做判空校驗(yàn)則會(huì)產(chǎn)生NullPointerException異常,本文就來介紹一下Java8 判空新寫法,感興趣的可以了解一下
    2021-09-09
  • Java中迭代器Iterator的使用解析

    Java中迭代器Iterator的使用解析

    Java采用了迭代器來為各種容器提供了公共的操作接口,下面通過本文給大家分享Java中迭代器Iterator的使用解析,需要的朋友參考下吧
    2017-09-09

最新評(píng)論