最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 = "無(wú)需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來(lái)說(shuō),空字符串可通過(guò)校驗(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ì)超過(guò)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 = "用戶初始化無(wú)需凍結(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 = "無(wú)需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來(lái)說(shuō),空字符串可通過(guò)校驗(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ì)超過(guò)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 = "用戶初始化無(wú)需凍結(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就不用說(shuō)了,是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.

大致意思就是說(shuō)@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ù)庫(kù)自動(dòng)生成,我們使用@Null注解校驗(yàn)。當(dāng)更新時(shí),id需要有值,根據(jù)ID去更新用戶名,我們使用@NotNull注解校驗(yàn)。無(wú)論是保存用戶還是更新用戶,都需要校驗(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í)候訪問(wèn)不同的接口就會(huì)進(jìn)行不同的校驗(yàn)了。

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

有時(shí)候默認(rèn)提供的校驗(yàn)注解無(wú)法滿足我們的需要,我們需要自定義。例如現(xiàn)有校驗(yàn)注解不支持java8中的LocalDateTime。那么接下來(lái)我們自定義一個(gè)校驗(yàn)LocalDateTime的注解。該注解判斷傳入的時(shí)間是否是一個(gè)過(guò)去的時(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 of project的解決辦法

    導(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à)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Spring?Cloud?OAuth2實(shí)現(xiàn)自定義token返回格式

    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使用釘釘機(jī)器人向釘釘群推送消息

    基于java使用釘釘機(jī)器人向釘釘群推送消息

    這篇文章主要介紹了基于java使用釘釘機(jī)器人向釘釘群推送消息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java線程實(shí)現(xiàn)時(shí)間動(dòng)態(tài)顯示

    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 日志的方式

    這篇文章主要介紹了Spring Boot mybatis-config 和 log4j 輸出sql 日志的方式,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Spring獲取當(dāng)前類在容器中的beanname實(shí)現(xiàn)思路

    Spring獲取當(dāng)前類在容器中的beanname實(shí)現(xiàn)思路

    這篇文章主要介紹了Spring獲取當(dāng)前類在容器中的beanname,實(shí)現(xiàn)思路只需繼承BeanNameAware接口,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    Java異常javax.net.ssl.SSLHandshakeException: SSL的解決方法

    在Java開發(fā)過(guò)程中,SSL(Secure Sockets Layer)握手異常是一個(gè)常見的網(wǎng)絡(luò)通信錯(cuò)誤,特別是在使用HTTPS協(xié)議進(jìn)行安全通信時(shí),本文將詳細(xì)分析javax.net.ssl.SSLHandshakeException: SSL這一異常的背景、可能的原因,并通過(guò)代碼示例幫助您理解和解決這一問(wèn)題
    2024-12-12
  • 如何在Eclipse中設(shè)置Oracle的JDBC

    如何在Eclipse中設(shè)置Oracle的JDBC

    以下是對(duì)在Eclipse中設(shè)置Oracle的JDBC的具體操作方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • java設(shè)計(jì)模式筆記之適配器模式

    java設(shè)計(jì)模式筆記之適配器模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之適配器模式筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別

    詳解Spring中Spel表達(dá)式和el表達(dá)式的區(qū)別

    在?Java?開發(fā)中,表達(dá)式語(yǔ)言是一種強(qiáng)大的工具,而SpEL?表達(dá)式與EL?表達(dá)式是我們常常遇到兩種表達(dá)式語(yǔ)言,下面我們就來(lái)看看它們的具體使用與區(qū)別吧
    2023-07-07

最新評(píng)論

沿河| 衡山县| 波密县| 孝义市| 大名县| 闻喜县| 西藏| 七台河市| 贵阳市| 房产| 新乐市| 中阳县| 抚宁县| 宕昌县| 南和县| 蒲江县| 建宁县| 红桥区| 马尔康县| 饶阳县| 白山市| 冷水江市| 吴堡县| 潞城市| 鄂伦春自治旗| 武山县| 荣成市| 梧州市| 确山县| 始兴县| 大冶市| 锡林浩特市| 峨眉山市| 内江市| 湖州市| 陇川县| 庄浪县| 武清区| 钦州市| 太谷县| 花垣县|