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

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

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

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

在項目中添加以下依賴

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項目,只需要引入web的starter即可,里面包含了所需依賴

二、常用的校驗注解及示例

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

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

在類上加@Validated注解

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

以controller層作示例如下:

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

四、校驗類方法中的自定義對象

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

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

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

}

3.在自定義對象中的屬性上加上校驗注解

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

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

一直對@Valid和@Validated這兩個注解非常疑惑,不知道怎么區(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的一個變種,擴展了@Valid的功能,支持group分組校驗的寫法。
那么我們對于@Valid和@Validated就可以這么理解:

能用@Valid的地方通常可以用@Validated替代。需要使用分組校驗的時候使用@Validated注解。

六、分組校驗

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

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),給每個校驗注解指定groups屬性,如果不指定則默認(rèn)為javax.validation.groups.Default.class。

我們讓SaveGroup和UpdateGroup繼承了Default, 那么三個接口之間的關(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 {
    /**
     * 分組校驗:保存用戶,不能傳ID
     */
    @PostMapping("/save")
    public void validSaveUser(@RequestBody @Validated(value = UserGroupValidDTO.SaveGroup.class) UserGroupValidDTO userDTO) {
        //save user
    }
    /**
     * 分組校驗:更新用戶信息,需要傳ID
     */
    @PostMapping("/update")
    public void validUpdateUser(@RequestBody @Validated(value = UserGroupValidDTO.UpdateGroup.class) UserGroupValidDTO userDTO) {
        //update user
    }

}

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

七、自定義校驗注解

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

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

/**
 * @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.編寫校驗規(guī)則

校驗規(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對Date校驗一樣使用@PastDate對LocalDateTime進行校驗了。

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

相關(guān)文章

  • Mybatis和Mybatis-Plus時間范圍查詢方式

    Mybatis和Mybatis-Plus時間范圍查詢方式

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

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

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

    pageHelper一對多分頁解決方案示例

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

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

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

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

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

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

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

    SpringCloud使用Feign文件上傳、下載

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

    了解SpringMVC的上傳和下載

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

    淺談Java8 判空新寫法

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

    Java中迭代器Iterator的使用解析

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

最新評論