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