日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Validation 校验

發(fā)布時(shí)間:2025/3/15 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Validation 校验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、概述

在 Web 應(yīng)用中,客戶端提交數(shù)據(jù)之前都會進(jìn)行數(shù)據(jù)的校驗(yàn),比如用戶注冊時(shí)填寫的郵箱地址是否符合規(guī)范、用戶名長度的限制等等,不過這并不意味著服務(wù)端的代碼可以免去數(shù)據(jù)驗(yàn)證的工作,用戶也可能使用 HTTP 工具直接發(fā)送違法數(shù)據(jù)。為了保證數(shù)據(jù)的安全性,服務(wù)端的數(shù)據(jù)校驗(yàn)是必須的。

  • 先理清概念:

JSR-303 是 JavaEE 6 中的一項(xiàng)子規(guī)范,又稱作 Bean Validation,提供了針對 Java Bean 字段的一些校驗(yàn)注解,如@NotNull,@Min等。JSR-349 是其升級版本,添加了一些新特性。Hibernate Validator 是對這個(gè)規(guī)范的實(shí)現(xiàn)(與 ORM 框架無關(guān)),并在它的基礎(chǔ)上增加了一些新的校驗(yàn)注解。Spring 本身也有一個(gè)校驗(yàn)接口Validator,位于org.springframework.validation 包下,但是使用這個(gè)接口需要進(jìn)行硬編碼,也就是手動(dòng)校驗(yàn),沒有提供注解進(jìn)行簡化。為了給開發(fā)者提供便捷,Spring 也全面支持 JSR-303、JSR-349 規(guī)范,對 Hibernate Validation 進(jìn)行二次封裝,在 SpringMVC 模塊中添加了自動(dòng)校驗(yàn)機(jī)制,可以利用注解對 Java Bean 的字段的值進(jìn)行校驗(yàn),并將校驗(yàn)信息封裝進(jìn)特定的類中。
下面將介紹如何在 Spring 應(yīng)用中使用 JSR-303 校驗(yàn)規(guī)范。

二、校驗(yàn)注解

  • JSR-303 包含的注解
  • 注解名稱說明
    @Null被注解元素必須為 null
    @NonNull被注解元素必須不為 null
    @AssertTrue被注解元素必須為 true
    @AssertFalse被注解元素必須為 false
    @Min(value)被注解元素必須是一個(gè)值,并且不能小于指定的值
    @Max(value)被注解元素必須是一個(gè)值,并且不能大于指定的值
    @DecimalMin(value)被注解元素必須是一個(gè)數(shù)字,并且不能小于指定的值
    @DecimalMax(value)被注解元素必須是一個(gè)數(shù)字,并且不能大于指定的值
    @Size(max=,min=)被注解元素的大小必須在指定范圍內(nèi)
    @Digits(integer,fraction)被注解元素必須是一個(gè)數(shù)字,其值必須在指定范圍內(nèi)
    @Past被注解元素必須是一個(gè)過去的日期
    @Future被注解元素必須是一個(gè)將來的日期
    @Pattern(regex=,flag=)被注解元素必須符合指定的正則表達(dá)式
  • Hibernate Validator 擴(kuò)展的注解
  • 注解名稱說明
    @NotBlank(message=)被注解的字符串必須非 null 且trim()后長度大于 0
    @Email被注解元素必須是電子郵箱地址
    @Length(min=,max=)被注解的字符串的長度必須在指定范圍內(nèi)
    @NotEmpty被注解元素(字符串、數(shù)組、集合等)必須非 null 且長度大于 0
    @Range(min=,max=,message=)被注解元素必須在合適的范圍內(nèi)
    @URL被注解元素必須是合法的 URL

    三、用法

  • 依賴
  • 如果你使用的是 SpringBoot(spirngboot升級到2.3之后默認(rèn)不再包含),那么只需引入spring-boot-starter-web即可,它的子依賴中包含了hibernate-validator和必要的數(shù)據(jù)綁定組件。

    在pom.xml中引入 Hibernate Validator 需要的依賴包: <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.10.Final</version> </dependency>

    springboot2.3后,使用以下:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
  • 實(shí)體類
  • @Data public class Student {private Long id;@NotBlank(message = "名稱不能為空") private String name;@Range(min = 10, max = 25, message = "年齡必須在10~25之間 ")private Integer age;@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$", message = "手機(jī)號碼格式錯(cuò)誤")@NotBlank(message = "手機(jī)號碼不能為空")private String phone;@Email(message = "郵箱格式錯(cuò)誤")private String email; }

    每一個(gè)注解都包含了message字段,用于校驗(yàn)失敗時(shí)作為提示信息。

  • 處理器方法
  • 在處理器方法需要校驗(yàn)的參數(shù)上添加 @Validated 注解,就可以“激活”對它的校驗(yàn)操作,后面?zhèn)魅胍粋€(gè) BindingResult 類型的參數(shù),用于獲取校驗(yàn)失敗情況下的反饋信息。

    @Controller public class StudentController {@AutowiredStudentMapper studentMapper;@PostMapping("/student")@ResponseBodypublic String addStudent(@RequestBody @Validated Student student, BindingResult result) {if (result.hasErrors()) {return JSONObject.toJSONString(result.getAllErrors());}studentMapper.insert(student);return "success";} }

    @Validated 注解的參數(shù)和 BindingResult 參數(shù)必須是成對出現(xiàn)的,并且一前一后。

    發(fā)送數(shù)據(jù),進(jìn)入上面的處理器:

    控制臺輸出:

    四、自定義校驗(yàn)

    假如現(xiàn)在有一個(gè)需求是學(xué)生名字的內(nèi)部不能含有空格,我們要如何自定義一個(gè)滿足該要求的校驗(yàn)?zāi)?#xff1f;

  • 自定義注解
  • @Target({FIELD, METHOD, PARAMETER}) @Retention(RUNTIME) @Constraint(validatedBy = NotContainSpaceValidator.class) public @interface NotContainSpace {//默認(rèn)屬性值String attr() default "attr";//默認(rèn)錯(cuò)誤消息String message() default "不能包含空格";//分組Class<?>[] groups() default {};//負(fù)載Class<? extends Payload>[] payload() default {};//指定多個(gè)時(shí)使用,從而支持重復(fù)注解@Target({FIELD, METHOD, PARAMETER})@Retention(RetentionPolicy.RUNTIME)@Documented@interface List {NotContainSpace[] value();} }

    @Constraint指定這個(gè)注解真正的校驗(yàn)者類。

  • 校驗(yàn)者類
    實(shí)現(xiàn)ConstraintValidator接口:
  • //第一個(gè)泛型參數(shù)是表明校驗(yàn)的注解類型,第二個(gè)泛型參數(shù)是需要被校驗(yàn)的類型 class NotContainSpaceValidator implements ConstraintValidator<NotContainSpace, String> {private String attr;/*** 初始化事件方法* @param notContainSpace*/@Overridepublic void initialize(NotContainSpace notContainSpace) {attr=notContainSpace.attr();}/*** 判斷是否合法的方法* @param s* @param context* @return*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext context) {if (s != null && s.trim().contains(" ")) {// 獲取默認(rèn)提示信息String constraintMessageTemplate = context.getDefaultConstraintMessageTemplate();System.out.println(attr+constraintMessageTemplate);// 禁用默認(rèn)提示信息// context.disableDefaultConstraintViolation();// 設(shè)置自定義信息context.buildConstraintViolationWithTemplate(attr+" 不能包含空格").addConstraintViolation();return false;}return true;} }

    第一個(gè)泛型參數(shù)是表明校驗(yàn)的注解類型,第二個(gè)泛型參數(shù)是需要被校驗(yàn)的類型。

    • initialize:初始化事件方法
    • isValid:判斷是否合法的方法

    ConstraintValidatorContext這個(gè)上下文包含了校驗(yàn)中所有的信息,我們可以利用這個(gè)對象進(jìn)行獲取默認(rèn)錯(cuò)誤提示信息,禁用錯(cuò)誤提示信息,改寫錯(cuò)誤提示信息等操作。

  • 使用
  • @NotContainSpace(attr="name") private String name;

    發(fā)送數(shù)據(jù):

    控制臺輸出:

    可以看到NotContainSpaceValidator的執(zhí)行是先于處理器方法的,并且禁用默認(rèn)提示語、設(shè)置新的提示語等操作都是有效的。

    五、分組校驗(yàn)

    如果對同一個(gè)類,在不同的使用場景下有不同的校驗(yàn)規(guī)則,就可以使用分組校驗(yàn)。比如更新一條學(xué)生記錄時(shí),要求 id 不為 null 且大于 0:

    public class Student {@Min(value = 1, groups = {Update.class}, message = "id錯(cuò)誤")private Long id; // 只有在Update分組下,限制才會起作用public interface Update{} // 分組是接口形式// ... }

    我們上面在對方法參數(shù)添加自動(dòng)校驗(yàn)時(shí)用的是@Valid注解,它是由 javax 提供的,其實(shí) Spring Validation 校驗(yàn)框架還提供了@Validated注解。在檢驗(yàn) Controller 的入?yún)⑹欠穹弦?guī)范時(shí),它們的基本驗(yàn)證功能并沒有多大區(qū)別。但是,現(xiàn)在要進(jìn)行分組校驗(yàn),就必須使用@Validated:

    @PutMapping("/student") public ApiResult updateStudent(@RequestBody @Validated({Student.Update.class}) Student student, BindingResult result) {if (result.hasErrors()) {for (ObjectError error : result.getAllErrors()) {// do stuff}return ApiResult.error();}studentService.update(student);return ApiResult.success(); }

    不過注意,在@Validated中指定了分組,那么其他未分組的校驗(yàn)將會被忽略。

    參考文章
    關(guān)于更多 @Valid 和 @Validated 的區(qū)別
    參考文章

    總結(jié)

    以上是生活随笔為你收集整理的Spring Validation 校验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。