SpringMVC中常用參數(shù)校驗(yà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í)間范圍查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java使用跳轉(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-04Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類示例詳解
這篇文章主要介紹了Java經(jīng)緯度小數(shù)與度分秒相互轉(zhuǎn)換工具類,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例
本文主要介紹了SpringBoot實(shí)現(xiàn)接口的各種參數(shù)校驗(yàn)的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01