日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

非Controller控制層參數(shù)校驗(yàn)要怎么做

來源: 責(zé)編: 時(shí)間:2024-03-26 09:34:47 185觀看
導(dǎo)讀上篇文章中我們介紹了如何自定義Springboot參數(shù)約束注解和約束校驗(yàn)器,默認(rèn)情況下,Springboot中的參數(shù)校驗(yàn)都是在Controller控制層完成的,那如果我們想要在非Controller控制層 進(jìn)行參數(shù)校驗(yàn)要怎么辦呢?本文將介紹非Control

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

看源碼

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

圖片圖片Yfh28資訊網(wǎng)——每日最新資訊28at.com

Validator

看注釋官方是讓我們?nèi)タ纯碫alidator#validate() 方法,官方讓我看我們就去看唄,索性直接看Validator 源碼:Yfh28資訊網(wǎng)——每日最新資訊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是做什么用的呢?Yfh28資訊網(wǎng)——每日最新資訊28at.com

Validator 接口 定義了用于執(zhí)行驗(yàn)證的方法,用于驗(yàn)證對(duì)象的字段值是否符合指定的約束條件。它主要提供了以下幾個(gè)核心方法:Yfh28資訊網(wǎng)——每日最新資訊28at.com

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

該方法用于驗(yàn)證給定對(duì)象是否符合指定的約束條件。Yfh28資訊網(wǎng)——每日最新資訊28at.com

參數(shù) object是要驗(yàn)證的對(duì)象,參數(shù) groups可選,表示驗(yàn)證組。Yfh28資訊網(wǎng)——每日最新資訊28at.com

返回一個(gè) Set 集合,其中包含違反約束條件的 ConstraintViolation 對(duì)象。Yfh28資訊網(wǎng)——每日最新資訊28at.com

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

  • 參數(shù) object是要驗(yàn)證的對(duì)象,參數(shù) propertyName是屬性名,參數(shù) groups可選,表示驗(yàn)證組。Yfh28資訊網(wǎng)——每日最新資訊28at.com

  • 返回一個(gè) Set 集合,其中包含違反約束條件的 ConstraintViolation 對(duì)象。Yfh28資訊網(wǎng)——每日最新資訊28at.com

  1. Yfh28資訊網(wǎng)——每日最新資訊28at.com

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

    Yfh28資訊網(wǎng)——每日最新資訊28at.com

  • 該方法用于驗(yàn)證給定屬性值是否符合指定的約束條件,而不需要實(shí)際創(chuàng)建對(duì)象實(shí)例。Yfh28資訊網(wǎng)——每日最新資訊28at.com

  • 參數(shù) beanType是對(duì)象類型,參數(shù) propertyName是屬性名,參數(shù) value是屬性值,參數(shù) groups可選,表示驗(yàn)證組。Yfh28資訊網(wǎng)——每日最新資訊28at.com

  • 返回一個(gè) Set 集合,其中包含違反約束條件的 ConstraintViolation 對(duì)象。Yfh28資訊網(wǎng)——每日最新資訊28at.com

這些方法能夠?qū)?Java 對(duì)象進(jìn)行全面的驗(yàn)證,從整個(gè)對(duì)象級(jí)別到單個(gè)屬性值的驗(yàn)證,都可以通過 Validator 接口提供的方法來實(shí)現(xiàn)。Yfh28資訊網(wǎng)——每日最新資訊28at.com

實(shí)操

從上面的介紹我們可以看到,實(shí)際上參數(shù)校驗(yàn)是通過 Validator 接口的實(shí)現(xiàn)類來驗(yàn)證的。下面我們通過代碼來看一下 Validator 接口怎么用?Yfh28資訊網(wǎng)——每日最新資訊28at.com

先把我們的老演員拿出來,下面再校驗(yàn)就用它了。Yfh28資訊網(wǎng)——每日最新資訊28at.com

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

依賴Spring 容器

JSR 303 提供了 Validator 接口作為規(guī)范接口,用于實(shí)現(xiàn)數(shù)據(jù)校驗(yàn)功能。在實(shí)際應(yīng)用中,我們并不需要自己從頭開始實(shí)現(xiàn)這一接口,因?yàn)橐呀?jīng)有官方參考實(shí)現(xiàn)——Hibernate Validator。Spring 框架作為廣泛使用的Java開發(fā)框架,自然也遵循這一原則,它并沒有重復(fù)造輪子,而是采用了 Hibernate Validator 的實(shí)現(xiàn)來支持校驗(yàn)功能。Yfh28資訊網(wǎng)——每日最新資訊28at.com

因此,當(dāng)我們使用 Spring 框架進(jìn)行開發(fā)時(shí),通常意味著我們可以直接利用 Spring 提供的集成,將 Validator 接口注入到我們的組件中,然后方便地使用它來進(jìn)行數(shù)據(jù)校驗(yàn)。Yfh28資訊網(wǎng)——每日最新資訊28at.com

下面來看下如何在Springboot中使用 Validator 接口。Yfh28資訊網(wǎng)——每日最新資訊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 校驗(yàn)對(duì)象屬性:");        System.out.println(constraintViolations);        System.out.println();        constraintViolations = validator.validateProperty(userBean, "age");        System.out.println("validateProperty校驗(yàn)age屬性是否合規(guī):");        System.out.println(constraintViolations);        System.out.println();        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );        System.out.println("validateValue校驗(yàn)age屬性的值是否合規(guī):");        System.out.println(constraintViolations);    }}

測(cè)試結(jié)果:Yfh28資訊網(wǎng)——每日最新資訊28at.com

validate 校驗(yàn)對(duì)象屬性:[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校驗(yàn)age屬性是否合規(guī):[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]validateValue校驗(yàn)age屬性的值是否合規(guī):[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

從打印結(jié)果中可以發(fā)現(xiàn)具體是哪些字段約束不通過、具體的提示信息都有。Yfh28資訊網(wǎng)——每日最新資訊28at.com

不依賴Spring 容器

JSR 303  是一種規(guī)范,意味著它 不依賴Spring 容器 ,能用Java的地方都可以用它,那如果我們?cè)诜荢pring框架的項(xiàng)目中怎么使用它呢?Yfh28資訊網(wǎng)——每日最新資訊28at.com

其實(shí),最主要的是能獲取到 Validator 接口的實(shí)現(xiàn),然后就可以進(jìn)行驗(yàn)證了。Validator 接口的實(shí)現(xiàn)可以通過如下代碼獲取,前提是要引入 Hibernate Validator 的依賴或者自己重新造輪子實(shí)現(xiàn)Validator 接口。Yfh28資訊網(wǎng)——每日最新資訊28at.com

public class ValidationUtils {    public static Validator getValidator(){        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();        return factory.getValidator();    }}
/** * @author 公眾號(hào)-索碼理(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 校驗(yàn)對(duì)象屬性:");        System.out.println(constraintViolations);        System.out.println();        constraintViolations = validator.validateProperty(userBean, "age");        System.out.println("validateProperty校驗(yàn)age屬性是否合規(guī):");        System.out.println(constraintViolations);        System.out.println();        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );        System.out.println("validateValue校驗(yàn)age屬性的值是否合規(guī):");        System.out.println(constraintViolations);    }}

打印結(jié)果:Yfh28資訊網(wǎng)——每日最新資訊28at.com

23:57:10.700 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator 8.0.1.Finalvalidate 校驗(yàn)對(duì)象屬性:[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校驗(yàn)age屬性是否合規(guī):[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]validateValue校驗(yàn)age屬性的值是否合規(guī):[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

可以看到 依賴Spring 容器 和 不依賴Spring 容器 ,兩者的調(diào)用結(jié)果都是相同的,不同之處就在于 Validator 的獲取,前者直接從 Spring 容器 獲取,后者需要通過工廠類獲取,適用范圍更廣一點(diǎn),在Spring框架中也能使用。Yfh28資訊網(wǎng)——每日最新資訊28at.com

總結(jié)

本文介紹了在非Controller控制層參數(shù)校驗(yàn)的兩種方法,不管是哪種獲取方法只要能達(dá)到結(jié)果就行,不過建議使用后者,可以把后者封裝成工具類,統(tǒng)一管理校驗(yàn)方法。Yfh28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79295-0.html非Controller控制層參數(shù)校驗(yàn)要怎么做

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 現(xiàn)代WPF界面輕松實(shí)現(xiàn):探秘輕量級(jí)WPFUI庫(kù),MVVM與依賴注入一體化

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 沭阳县| 山西省| 武功县| 建始县| 沙湾县| 黄浦区| 调兵山市| 四会市| 合作市| 宁阳县| 台南市| 涟源市| 鄂伦春自治旗| 明溪县| 湖南省| 电白县| 桐城市| 湄潭县| 什邡市| 广水市| 西藏| 马尔康县| 佛冈县| 方山县| 本溪市| 扎囊县| 华阴市| 如东县| 志丹县| 开阳县| 乌鲁木齐县| 焉耆| 沛县| 运城市| 类乌齐县| 梁平县| 吉首市| 无棣县| 肇源县| 纳雍县| 许昌市|