AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-03-26 09:34:47 200觀看
導讀上篇文章中我們介紹了如何自定義Springboot參數約束注解和約束校驗器,默認情況下,Springboot中的參數校驗都是在Controller控制層完成的,那如果我們想要在非Controller控制層 進行參數校驗要怎么辦呢?本文將介紹非Control

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

看源碼

從上篇文章中我們知道Spring提供了JSR-303 的一個變種  @Validated  ,下面我們看一下 @Validated 的部分源碼。H0A28資訊網——每日最新資訊28at.com

圖片圖片H0A28資訊網——每日最新資訊28at.com

Validator

看注釋官方是讓我們去看看Validator#validate() 方法,官方讓我看我們就去看唄,索性直接看Validator 源碼:H0A28資訊網——每日最新資訊28at.com

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是做什么用的呢?H0A28資訊網——每日最新資訊28at.com

Validator 接口 定義了用于執行驗證的方法,用于驗證對象的字段值是否符合指定的約束條件。它主要提供了以下幾個核心方法:H0A28資訊網——每日最新資訊28at.com

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

該方法用于驗證給定對象是否符合指定的約束條件。H0A28資訊網——每日最新資訊28at.com

參數 object是要驗證的對象,參數 groups可選,表示驗證組。H0A28資訊網——每日最新資訊28at.com

返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。H0A28資訊網——每日最新資訊28at.com

  1. <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups):
  • 該方法用于驗證給定對象的特定屬性是否符合指定的約束條件。H0A28資訊網——每日最新資訊28at.com

  • 參數 object是要驗證的對象,參數 propertyName是屬性名,參數 groups可選,表示驗證組。H0A28資訊網——每日最新資訊28at.com

  • 返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。H0A28資訊網——每日最新資訊28at.com

  1. H0A28資訊網——每日最新資訊28at.com

    <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups):H0A28資訊網——每日最新資訊28at.com

    H0A28資訊網——每日最新資訊28at.com

  • 該方法用于驗證給定屬性值是否符合指定的約束條件,而不需要實際創建對象實例。H0A28資訊網——每日最新資訊28at.com

  • 參數 beanType是對象類型,參數 propertyName是屬性名,參數 value是屬性值,參數 groups可選,表示驗證組。H0A28資訊網——每日最新資訊28at.com

  • 返回一個 Set 集合,其中包含違反約束條件的 ConstraintViolation 對象。H0A28資訊網——每日最新資訊28at.com

這些方法能夠對 Java 對象進行全面的驗證,從整個對象級別到單個屬性值的驗證,都可以通過 Validator 接口提供的方法來實現。H0A28資訊網——每日最新資訊28at.com

實操

從上面的介紹我們可以看到,實際上參數校驗是通過 Validator 接口的實現類來驗證的。下面我們通過代碼來看一下 Validator 接口怎么用?H0A28資訊網——每日最新資訊28at.com

先把我們的老演員拿出來,下面再校驗就用它了。H0A28資訊網——每日最新資訊28at.com

@Datapublic class UserBean {    @NotBlank    private String username;    @Min(value = 18)    private Integer age;}

依賴Spring 容器

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

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

下面來看下如何在Springboot中使用 Validator 接口。H0A28資訊網——每日最新資訊28at.com

@SpringBootTestclass 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);    }}

測試結果:H0A28資訊網——每日最新資訊28at.com

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}'}]

從打印結果中可以發現具體是哪些字段約束不通過、具體的提示信息都有。H0A28資訊網——每日最新資訊28at.com

不依賴Spring 容器

JSR 303  是一種規范,意味著它 不依賴Spring 容器 ,能用Java的地方都可以用它,那如果我們在非Spring框架的項目中怎么使用它呢?H0A28資訊網——每日最新資訊28at.com

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

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);    }}

打印結果:H0A28資訊網——每日最新資訊28at.com

23:57:10.700 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator 8.0.1.Finalvalidate 校驗對象屬性:[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框架中也能使用。H0A28資訊網——每日最新資訊28at.com

總結

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

本文鏈接:http://www.tebozhan.com/showinfo-26-79295-0.html非Controller控制層參數校驗要怎么做

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 現代WPF界面輕松實現:探秘輕量級WPFUI庫,MVVM與依賴注入一體化

下一篇: Spring Boot整合Camunda打造高效工作流程

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 從零到英雄:高并發與性能優化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經為公司的系統在面對高并發和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創作者|程心排版|王喻可2016年7月13日,百度云計算戰略發布會在北京舉行,宣告著百度智能云的正式啟程。彼時的會場座無虛席,甚至排隊排到了門外,在場的所有人幾乎都
  • 阿里瓴羊One推出背后,零售企業迎數字化新解

    作者:劉曠近年來隨著數字經濟的高速發展,各式各樣的SaaS應用服務更是層出不窮,但本質上SaaS大多局限于單一業務流層面,對用戶核心關切的增長問題等則沒有提供更好的解法。在Saa
  • 三星顯示已開始為AR設備研發硅基LED微顯示屏

    7月18日消息,據外媒報道,隨著蘋果首款頭顯產品Vision Pro在6月份正式推出,AR/VR/MR等頭顯產品也就將成為各大公司下一個重要的競爭領域,對顯示屏這一關
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
Top