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)長度,可以用于Array,Collection,Map,String
@Size(min = 4, max = 8, message = "用戶名長度錯(cuò)誤 by size")
//校驗(yàn)長度,只能用于String
@Length(min = 4, max = 8, message = "用戶名長度錯(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 = "密碼長度不對(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 = "用戶名長度超出限制") 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)長度,可以用于Array,Collection,Map,String
@Size(min = 4, max = 8, message = "用戶名長度錯(cuò)誤 by size")
//校驗(yàn)長度,只能用于String
@Length(min = 4, max = 8, message = "用戶名長度錯(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 = "密碼長度不對(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)文章
導(dǎo)入項(xiàng)目出現(xiàn)Java多個(gè)工程相互引用異常A cycle was detected in the build path o
今天小編就為大家分享一篇關(guān)于導(dǎo)入項(xiàng)目出現(xiàn)Java多個(gè)工程相互引用異常A cycle was detected in the build path of project的解決辦法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
Spring?Cloud?OAuth2實(shí)現(xiàn)自定義token返回格式
Spring?Security?OAuth的token返回格式都是默認(rèn)的,但是往往這個(gè)格式是不適配系統(tǒng)。本文將用一個(gè)接口優(yōu)雅的實(shí)現(xiàn)?Spring?Cloud?OAuth2?自定義token返回格式,需要的可以參考一下2022-06-06
Java線程實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示
這篇文章主要為大家詳細(xì)介紹了Java線程實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式
這篇文章主要介紹了Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
Spring獲取當(dāng)前類在容器中的beanname實(shí)現(xiàn)思路
這篇文章主要介紹了Spring獲取當(dāng)前類在容器中的beanname,實(shí)現(xiàn)思路只需繼承BeanNameAware接口,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法
在Java開發(fā)過程中,SSL(Secure Sockets Layer)握手異常是一個(gè)常見的網(wǎng)絡(luò)通信錯(cuò)誤,特別是在使用HTTPS協(xié)議進(jìn)行安全通信時(shí),本文將詳細(xì)分析javax.net.ssl.SSLHandshakeException: SSL這一異常的背景、可能的原因,并通過代碼示例幫助您理解和解決這一問題2024-12-12
詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別
在?Java?開發(fā)中,表達(dá)式語言是一種強(qiáng)大的工具,而SpEL?表達(dá)式與EL?表達(dá)式是我們常常遇到兩種表達(dá)式語言,下面我們就來看看它們的具體使用與區(qū)別吧2023-07-07

