成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

非Controller控制層參數校驗要怎么做

開發 前端
本文介紹了在非Controller控制層參數校驗的兩種方法,不管是哪種獲取方法只要能達到結果就行,不過建議使用后者,可以把后者封裝成工具類,統一管理校驗方法。

上篇文章中我們介紹了如何自定義Springboot參數約束注解和約束校驗器,默認情況下,Springboot中的參數校驗都是在Controller控制層完成的,那如果我們想要在非Controller控制層 進行參數校驗要怎么辦呢?本文將介紹非Controller控制層 參數校驗的方法。

看源碼

從上篇文章中我們知道Spring提供了JSR-303 的一個變種  @Validated  ,下面我們看一下 @Validated 的部分源碼。

圖片圖片

Validator

看注釋官方是讓我們去看看Validator#validate() 方法,官方讓我看我們就去看唄,索性直接看Validator 源碼:

public interface Validator {

 <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);

 <T> Set<ConstraintViolation<T>> validateProperty(T object,
              String propertyName,
              Class<?>... groups);

 <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
              String propertyName,
              Object value,
              Class<?>... groups);

 BeanDescriptor getConstraintsForClass(Class<?> clazz);

 <T> T unwrap(Class<T> type);

 ExecutableValidator forExecutables();
}

那Validator是做什么用的呢?

Validator 接口 定義了用于執行驗證的方法,用于驗證對象的字段值是否符合指定的約束條件。它主要提供了以下幾個核心方法:

  1. <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups):

該方法用于驗證給定對象是否符合指定的約束條件。

參數 object是要驗證的對象,參數 groups可選,表示驗證組。

返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。

  1. <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups):

      該方法用于驗證給定對象的特定屬性是否符合指定的約束條件。

      參數 object是要驗證的對象,參數 propertyName是屬性名,參數 groups可選,表示驗證組。

      返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。

  1. <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups):

       該方法用于驗證給定屬性值是否符合指定的約束條件,而不需要實際創建對象實例。

       參數 beanType是對象類型,參數 propertyName是屬性名,參數 value是屬性值,參數 groups可選,表示驗證組。

       返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。

這些方法能夠對 Java 對象進行全面的驗證,從整個對象級別到單個屬性值的驗證,都可以通過 Validator 接口提供的方法來實現。

實操

從上面的介紹我們可以看到,實際上參數校驗是通過 Validator 接口的實現類來驗證的。下面我們通過代碼來看一下 Validator 接口怎么用?

先把我們的老演員拿出來,下面再校驗就用它了。

@Data
public class UserBean {

    @NotBlank
    private String username;

    @Min(value = 18)
    private Integer age;
}

依賴Spring 容器

JSR 303 提供了 Validator 接口作為規范接口,用于實現數據校驗功能。在實際應用中,我們并不需要自己從頭開始實現這一接口,因為已經有官方參考實現——Hibernate Validator。Spring 框架作為廣泛使用的Java開發框架,自然也遵循這一原則,它并沒有重復造輪子,而是采用了 Hibernate Validator 的實現來支持校驗功能。

因此,當我們使用 Spring 框架進行開發時,通常意味著我們可以直接利用 Spring 提供的集成,將 Validator 接口注入到我們的組件中,然后方便地使用它來進行數據校驗。

下面來看下如何在Springboot中使用 Validator 接口。

@SpringBootTest
class SpringbootPracticeApplicationTests {
 @Resource
    private Validator validator;

 @Test
    public void testValidator(){
        UserBean userBean = new UserBean();
        userBean.setAge(17);
        userBean.setUsername(null);

        Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
        System.out.println("validate 校驗對象屬性:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateProperty(userBean, "age");
        System.out.println("validateProperty校驗age屬性是否合規:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
        System.out.println("validateValue校驗age屬性的值是否合規:");
        System.out.println(constraintViolations);
    }
}

測試結果:

validate 校驗對象屬性:
[ConstraintViolationImpl{interpolatedMessage='不能為空', propertyPath=username, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.NotBlank.message}'}, 
ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateProperty校驗age屬性是否合規:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateValue校驗age屬性的值是否合規:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

從打印結果中可以發現具體是哪些字段約束不通過、具體的提示信息都有。

不依賴Spring 容器

JSR 303  是一種規范,意味著它 不依賴Spring 容器 ,能用Java的地方都可以用它,那如果我們在非Spring框架的項目中怎么使用它呢?

其實,最主要的是能獲取到 Validator 接口的實現,然后就可以進行驗證了。Validator 接口的實現可以通過如下代碼獲取,前提是要引入 Hibernate Validator 的依賴或者自己重新造輪子實現Validator 接口。

public class ValidationUtils {

    public static Validator getValidator(){
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        return factory.getValidator();
    }
}
/**
 * @author 公眾號-索碼理(suncodernote)
 */
public class ValidatorTest {
    public static void main(String[] args) {
        Validator validator = ValidationUtils.getValidator();

        UserBean userBean = new UserBean();
        userBean.setAge(17);
        userBean.setUsername(null);

        Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
        System.out.println("validate 校驗對象屬性:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateProperty(userBean, "age");
        System.out.println("validateProperty校驗age屬性是否合規:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
        System.out.println("validateValue校驗age屬性的值是否合規:");
        System.out.println(constraintViolations);
    }
}

打印結果:

23:57:10.700 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator 8.0.1.Final
validate 校驗對象屬性:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}, 
ConstraintViolationImpl{interpolatedMessage='不能為空', propertyPath=username, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.NotBlank.message}'}]

validateProperty校驗age屬性是否合規:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateValue校驗age屬性的值是否合規:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

可以看到 依賴Spring 容器 和 不依賴Spring 容器 ,兩者的調用結果都是相同的,不同之處就在于 Validator 的獲取,前者直接從 Spring 容器 獲取,后者需要通過工廠類獲取,適用范圍更廣一點,在Spring框架中也能使用。

總結

本文介紹了在非Controller控制層參數校驗的兩種方法,不管是哪種獲取方法只要能達到結果就行,不過建議使用后者,可以把后者封裝成工具類,統一管理校驗方法。

責任編輯:武曉燕 來源: 索碼理
相關推薦

2019-07-02 10:22:15

TCP流量數據

2020-08-31 08:42:21

Node Controller數據校驗

2022-08-23 14:51:37

網絡安全領導層存儲

2022-03-10 11:25:51

InnoDB優化

2023-09-27 22:44:18

數據遷移數據庫

2017-10-25 09:50:51

Linux

2020-11-17 10:23:56

安全黑客網站

2021-10-22 14:50:23

Spring BootJava

2020-11-18 14:01:07

設計師產品需求項目

2024-03-14 11:48:44

系統監控指標分布式

2016-09-21 10:18:26

阿里Dubbo性能測試

2021-11-10 10:03:18

SpringBootJava代碼

2021-03-06 16:16:15

分模塊分層

2025-04-28 08:59:25

2021-03-11 17:36:51

架構分模塊分層

2015-10-19 10:30:44

物聯網營銷

2023-12-14 17:21:28

前端性能優化

2011-07-05 17:05:15

CIO

2023-07-10 15:35:46

2020-07-28 08:36:54

數據安全數據泄露數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久动漫日韩 | 二区三区在线观看 | 成人久久视频 | 欧美日韩在线一区二区三区 | 毛片免费观看视频 | 99热精品久久 | 高清色 | 一区二区三区免费在线观看 | 国产精品日韩欧美一区二区三区 | 久久精品亚洲成在人线av网址 | 久久久久国产精品人 | 精品久久久一区二区 | 日韩成人免费视频 | 一级黄色片一级黄色片 | 国产精品99久久久精品免费观看 | 一区二区在线 | 久久久久成人精品 | 精品96久久久久久中文字幕无 | 精品国产视频 | 美女国产一区 | 亚洲免费精品 | 欧美日韩中文国产一区发布 | 一区二区日韩 | 中文字幕亚洲国产 | 中文字幕国产一区 | 国产精品久久9 | 成人免费网站在线 | 日本亚洲一区 | 精品国产久 | 精品国产久 | 日本一区二区三区在线观看 | 国产欧美精品一区二区三区 | 免费在线观看一区二区 | 自拍偷拍亚洲视频 | 色爱综合网 | 亚洲国产精品99久久久久久久久 | 欧美日韩在线视频一区二区 | 国产成人自拍av | 美女黄网站 | 日韩一区二区三区四区五区六区 | 久久精品国产一区二区电影 |