亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Bean Validation完結(jié)篇:你必須關(guān)注的邊邊角角(約束級(jí)聯(lián)、自定義約束、自定義校驗(yàn)器、國(guó)際

niuxiaowei111 / 1255人閱讀

摘要:和上標(biāo)注的約束都會(huì)被執(zhí)行注意如果子類覆蓋了父類的方法,那么子類和父類的約束都會(huì)被校驗(yàn)。

每篇一句
沒有任何技術(shù)方案會(huì)是一種銀彈,任何東西都是有利弊的
相關(guān)閱讀

【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例
【小家Spring】Spring方法級(jí)別數(shù)據(jù)校驗(yàn):@Validated + MethodValidationPostProcessor優(yōu)雅的完成數(shù)據(jù)校驗(yàn)動(dòng)作
【小家Java】深入了解數(shù)據(jù)校驗(yàn)(Bean Validation):從深處去掌握@Valid的作用(級(jí)聯(lián)校驗(yàn))以及常用約束注解的解釋說明

對(duì)Spring感興趣可掃碼加入wx群:Java高工、架構(gòu)師3群(文末有二維碼)

前言

一般來說,對(duì)于web項(xiàng)目我們都有必要對(duì)請(qǐng)求參數(shù)進(jìn)行校驗(yàn),有的前端使用JavaScript校驗(yàn),但是為了安全起見后端的校驗(yàn)都是必須的。因此數(shù)據(jù)校驗(yàn)不僅僅是在web下,在方方面面都是一個(gè)重要的點(diǎn)。前端校驗(yàn)有它的JS校驗(yàn)框架(比如我之前用的jQuery Validation Plugin),后端自然也少不了。

前面洋洋灑灑已經(jīng)把數(shù)據(jù)校驗(yàn)Bean Validation講了很多了,如果你已經(jīng)運(yùn)用在你的項(xiàng)目中,勢(shì)必將大大提高生產(chǎn)力吧,本文作為完結(jié)篇(不是總結(jié)篇)就不用再系統(tǒng)性的介紹Bean Validation他了,而是旨在介紹你在使用過程中不得不關(guān)心的周邊、細(xì)節(jié)~

如果說前面是用機(jī),那么本文就有點(diǎn)玩機(jī)的意思~
BV(Bean Validation)的使用范圍

本次再次強(qiáng)調(diào)了這一點(diǎn)(設(shè)計(jì)思想是我認(rèn)為特別重要的存在):使用范圍。
Bean Validation并不局限于應(yīng)用程序的某一層或者哪種編程模型, 它可以被用在任何一層, 除了web程序,也可以是像Swing這樣的富客戶端程序中(GUI編程)。

我抄了一副業(yè)界著名的圖給大家:

Bean Validation的目標(biāo)是簡(jiǎn)化Bean校驗(yàn),將以往重復(fù)的校驗(yàn)邏輯進(jìn)行抽象和標(biāo)準(zhǔn)化,形成統(tǒng)一API規(guī)范;

說到抽象統(tǒng)一API,它可不是亂來的,只有當(dāng)你能最大程度的得到公有,這個(gè)動(dòng)作才有意義,至少它一般都是與業(yè)務(wù)無關(guān)的。抽象能力是對(duì)程序員分級(jí)的最重要標(biāo)準(zhǔn)之一
約束繼承

如果子類繼承自他的父類,除了校驗(yàn)子類,同時(shí)還會(huì)校驗(yàn)父類,這就是約束繼承(同樣適用于接口)。

// child和person上標(biāo)注的約束都會(huì)被執(zhí)行
public class Child extends Person {
    ...
}

注意:如果子類覆蓋了父類的方法,那么子類和父類的約束都會(huì)被校驗(yàn)。

約束級(jí)聯(lián)(級(jí)聯(lián)校驗(yàn))

如果要驗(yàn)證屬性關(guān)聯(lián)的對(duì)象,那么需要在屬性上添加@Valid注解,如果一個(gè)對(duì)象被校驗(yàn),那么它的所有的標(biāo)注了@Valid的關(guān)聯(lián)對(duì)象都會(huì)被校驗(yàn),這些對(duì)象也可以是數(shù)組、集合、Map等,這時(shí)會(huì)驗(yàn)證他們持有的所有元素。

Demo

@Getter
@Setter
@ToString
public class Person {

    @NotNull
    private String name;
    @NotNull
    @Positive
    private Integer age;

    @Valid
    @NotNull
    private InnerChild child;
    @Valid // 讓它校驗(yàn)List里面所有的屬性
    private List childList;

    @Getter
    @Setter
    @ToString
    public static class InnerChild {
        @NotNull
        private String name;
        @NotNull
        @Positive
        private Integer age;
    }

}

校驗(yàn)程序:

    public static void main(String[] args) {
        Person person = new Person();
        person.setName("fsx");
        Person.InnerChild child = new Person.InnerChild();
        child.setName("fsx-age");
        child.setAge(-1);
        person.setChild(child);

        // 設(shè)置childList
        person.setChildList(new ArrayList(){{
            Person.InnerChild innerChild = new Person.InnerChild();
            innerChild.setName("innerChild1");
            innerChild.setAge(-11);
            add(innerChild);

            innerChild = new Person.InnerChild();
            innerChild.setName("innerChild2");
            innerChild.setAge(-12);
            add(innerChild);
        }});

        Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false)
                .buildValidatorFactory().getValidator();
        Set> result = validator.validate(person);

        // 輸出錯(cuò)誤消息
        result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue())
                .forEach(System.out::println);
    }

打印校驗(yàn)失敗的消息:

age 不能為null: null
childList[0].age 必須是正數(shù): -11
child.age 必須是正數(shù): -1
childList[1].age 必須是正數(shù): -12
約束失敗消息message自定義

每個(gè)約束定義中都包含有一個(gè)用于提示驗(yàn)證結(jié)果的消息模版message,并且在聲明一個(gè)約束條件的時(shí)候,你可以通過這個(gè)約束注解中的message屬性來重寫默認(rèn)的消息模版(這是自定義message最簡(jiǎn)單的一種方式)。

如果在校驗(yàn)的時(shí)候,這個(gè)約束條件沒有通過,那么你配置的MessageInterpolator插值器會(huì)被用來當(dāng)成解析器來解析這個(gè)約束中定義的消息模版, 從而得到最終的驗(yàn)證失敗提示信息。
默認(rèn)使用的插值器是org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator,它借助org.hibernate.validator.spi.resourceloading.ResourceBundleLocator來獲取到國(guó)際化資源屬性文件從而填充模版內(nèi)容~

資源解析器默認(rèn)使用的實(shí)現(xiàn)是PlatformResourceBundleLocator,在配置Configuration初始化的時(shí)候默認(rèn)被賦值:

    private ConfigurationImpl() {
        this.validationBootstrapParameters = new ValidationBootstrapParameters();

        // 默認(rèn)的國(guó)際化資源文件加載器USER_VALIDATION_MESSAGES值為:ValidationMessages
        // 這個(gè)值就是資源文件的文件名~~~~
        this.defaultResourceBundleLocator = new PlatformResourceBundleLocator(
                ResourceBundleMessageInterpolator.USER_VALIDATION_MESSAGES
        );
        this.defaultTraversableResolver = TraversableResolvers.getDefault();
        this.defaultConstraintValidatorFactory = new ConstraintValidatorFactoryImpl();
        this.defaultParameterNameProvider = new DefaultParameterNameProvider();
        this.defaultClockProvider = DefaultClockProvider.INSTANCE;
    }

這個(gè)解析器會(huì)嘗試解析模版中的占位符( 大括號(hào)括起來的字符串,形如這樣{xxx})。
它解析message的核心代碼如下(比如此處message模版是{javax.validation.constraints.NotNull.message}為例):

public abstract class AbstractMessageInterpolator implements MessageInterpolator {
    ...
    private String interpolateMessage(String message, Context context, Locale locale) throws MessageDescriptorFormatException {
        // 如果message消息木有占位符,那就直接返回  不再處理了~
        // 這里自定義的優(yōu)先級(jí)是最高的~~~
        if ( message.indexOf( "{" ) < 0 ) {
            return replaceEscapedLiterals( message );
        }

        // 調(diào)用resolveMessage方法處理message中的占位符和el表達(dá)式
        if ( cachingEnabled ) {
            resolvedMessage = resolvedMessages.computeIfAbsent( new LocalizedMessage( message, locale ), lm -> resolveMessage( message, locale ) );
        } else {
            resolvedMessage = resolveMessage( message, locale );
        }    
        ...
    }

    private String resolveMessage(String message, Locale locale) {
        String resolvedMessage = message;

        // 獲取資源ResourceBundle三部曲
        ResourceBundle userResourceBundle = userResourceBundleLocator.getResourceBundle( locale );
        ResourceBundle constraintContributorResourceBundle = contributorResourceBundleLocator.getResourceBundle( locale );
        ResourceBundle defaultResourceBundle = defaultResourceBundleLocator.getResourceBundle( locale );
        ...
    }
}

對(duì)如上message的處理步驟大致總結(jié)如下:

若沒占位符符號(hào){需要處理,直接返回(比如我們自定義message屬性值全是文字,就直接返回了)~

占位符或者EL,交給resolveMessage()方法從資源文件里拿內(nèi)容來處理~

拿取資源文件,按照如下三個(gè)步驟尋找:

    1. `userResourceBundleLocator`:去用戶自己的`classpath`里面去找資源文件(默認(rèn)名字是`ValidationMessages.properties`,當(dāng)然你也可以使用國(guó)際化名)
    2. `contributorResourceBundleLocator`:加載貢獻(xiàn)的資源包
    3. `defaultResourceBundle`:默認(rèn)的策略。去這里`于/org/hibernate/validator`加載`ValidationMessages.properties`

需要注意的是,如上是加載資源的順序。無論怎么樣,這三處的資源文件都會(huì)加載進(jìn)內(nèi)存的(并無短路邏輯)。進(jìn)行占位符匹配的時(shí)候,依舊遵守這規(guī)律

    1. 最先用自己當(dāng)前項(xiàng)目`classpath`下的資源去匹配資源占位符,若沒匹配上再用下一級(jí)別的資源~~~
    2. 規(guī)律同上,依次類推,遞歸的匹配所有的占位符(若占位符沒匹配上,原樣輸出,并不是輸出`null`哦~)

需要注意的是,因?yàn)?b>{在此處是特殊字符,若你就想輸出{,請(qǐng)轉(zhuǎn)義:{

了解了這些之后,想自定義失敗消息message,就簡(jiǎn)直不要太簡(jiǎn)單了好不好,例子如下:

    @Min(value = 10, message = "{com.fsx.my.min.message}")
    private Integer age;

寫一個(gè)資源屬性文件,命名為ValidationMessages.properties放在類路徑下,文件內(nèi)容如下:

// 此處可以使用占位符{value}讀取注解對(duì)應(yīng)屬性上的值
com.fsx.my.min.message=[自定義消息]最小值必須是{value}

運(yùn)行測(cè)試用例,打印輸出如下失敗消息:

age [自定義消息]最小值必須是10: -1

完美(自定義的生效了)

說明:因?yàn)槲业钠脚_(tái)是中文的,因此文件命名為ValidationMessages_zh_CN.properties的效果也是一樣的,因?yàn)?b>Hibernate Validation提供了Locale國(guó)際化的支持
Spring環(huán)境下自定義國(guó)際化消息

上面使用的是Hibernate Validation內(nèi)置的對(duì)國(guó)際化的支持,由于大部分情況下我們都是在Spring環(huán)境下使用數(shù)據(jù)校驗(yàn),因此有必要講講Spring加持情況下的國(guó)家化做法。我們知道Spring MVC是有專門做國(guó)際化的模塊的,因此國(guó)際化這個(gè)動(dòng)作當(dāng)然也是可以交給Spring自己來做的,此處我也給一個(gè)Demo吧:

說明:即使在Spring環(huán)境下,你照常使用Hibernate Validation的國(guó)際化方案,依舊是沒有問題的~

1、向容器內(nèi)配置驗(yàn)證器(含有自己的國(guó)際化資源文件):

@Configuration
public class RootConfig {

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();

        // 使用Spring加載國(guó)際化資源文件
        //ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        //messageSource.setBasename("MyValidationMsg");

        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("MyValidationMsg"); // 注意此處名字就隨意啦,畢竟交給spring了`.properties`就不需要了哦
        messageSource.setCacheSeconds(120); // 緩存時(shí)長(zhǎng)
        // messageSource.setFileEncodings(); // 設(shè)置編碼 UTF-8

        localValidatorFactoryBean.setValidationMessageSource(messageSource);
        return localValidatorFactoryBean;
    }
}

運(yùn)行單測(cè):

@Slf4j
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfig.class})
public class TestSpringBean {

    @Autowired
    private LocalValidatorFactoryBean localValidatorFactoryBean;

    @Test
    public void test1() {
        Person person = new Person();
        person.setAge(-5);

        Validator validator = localValidatorFactoryBean.getValidator();
        Set> result = validator.validate(person);

        // 輸出錯(cuò)誤消息
        result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue())
                .forEach(System.out::println);
    }

}

打印校驗(yàn)失敗消息如下(完美生效):

age [自定義消息]最小值必須是10: -5

說明:若是Spring應(yīng)用,如果你還需要考慮國(guó)際化的話,我個(gè)人建議使用Spring來處理國(guó)際化,而不是Hibernate~(有種Spring的腦殘粉感覺有木有,當(dāng)然這不是強(qiáng)制的)

Spring MVC中如何自定義全局校驗(yàn)器Validator

Spring MVC默認(rèn)配置的(使用的)校驗(yàn)器的執(zhí)行代碼如下:

public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {
    ...
    @Bean
    public Validator mvcValidator() {
        Validator validator = getValidator();
        if (validator == null) {
            if (ClassUtils.isPresent("javax.validation.Validator", getClass().getClassLoader())) {
                Class clazz;
                try {
                    String className = "org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean";
                    clazz = ClassUtils.forName(className, WebMvcConfigurationSupport.class.getClassLoader());
                } catch (ClassNotFoundException | LinkageError ex) {
                    throw new BeanInitializationException("Failed to resolve default validator class", ex);
                }
                validator = (Validator) BeanUtils.instantiateClass(clazz);
            } else {
                validator = new NoOpValidator();
            }
        }
        return validator;
    }
    ...
}

代碼很簡(jiǎn)答,就不逐行解釋了。我歸納如下:

Spring MVC中校驗(yàn)要想自動(dòng)生效,必須導(dǎo)入了javax.validation.Validator才行,否則是new NoOpValidator()它木有校驗(yàn)行為

Spring MVC最終默認(rèn)使用的校驗(yàn)器是OptionalValidatorFactoryBeanLocalValidatorFactoryBean的子類)~

顯然,要想校驗(yàn)生效@EnableWebMvc也是必須的(SpringBoot環(huán)境另說)

那如何自定義一個(gè)全局的校驗(yàn)器呢?最佳做法如下:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    ...
    @Override
    public Validator getValidator() {
        // return "global" validator
        return new LocalValidatorFactoryBean();
    }
    ...
}

當(dāng)然,你還可以使用@InitBinder來設(shè)置,甚至可以細(xì)粒度設(shè)置到只與當(dāng)前Controller綁定的校驗(yàn)器都是可行的(比如你可以使用自定校驗(yàn)器實(shí)現(xiàn)各種私有的、比較復(fù)雜的邏輯判斷)

==自定義約束==

JSRHibernate支持的約束條件已經(jīng)足夠強(qiáng)大,應(yīng)該是能滿足我們絕大部分情況下的基礎(chǔ)驗(yàn)證的。如果還是不能滿足業(yè)務(wù)需求,我們還可以自定義約束,也很簡(jiǎn)單一事。

JSRHibernate提供的約束注解解釋說明:【小家Java】深入了解數(shù)據(jù)校驗(yàn)(Bean Validation):從深處去掌握@Valid的作用(級(jí)聯(lián)校驗(yàn))以及常用約束注解的解釋說明

自定義一個(gè)約束分如下三步(說是2步也成):

自定義一個(gè)約束注解

實(shí)現(xiàn)一個(gè)校驗(yàn)器(實(shí)現(xiàn)接口:ConstraintValidator)

定義默認(rèn)的校驗(yàn)錯(cuò)誤信息

給個(gè)Demo:此處以自定義一個(gè)約束注解來校驗(yàn)集合的長(zhǎng)度范圍@CollectionRange

1、自定義注解(此處使用得比較高級(jí))

@Documented
@Constraint(validatedBy = {})
@SupportedValidationTarget(ValidationTarget.ANNOTATED_ELEMENT)
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Repeatable(value = CollectionRange.List.class)
@Size // 校驗(yàn)動(dòng)作委托給Size去完成  所以它自己并不需要校驗(yàn)器~~~
@ReportAsSingleViolation // 組合組件一般建議標(biāo)注上
public @interface CollectionRange {

    // 三個(gè)必備的基本屬性
    String message() default "{com.fsx.my.collection.message}";
    Class[] groups() default {};
    Class[] payload() default {};

    // 自定義屬性  @OverridesAttribute這里有點(diǎn)方法覆蓋的意思~~~~~~ 子類屬性覆蓋父類的默認(rèn)值嘛
    @OverridesAttribute(constraint = Size.class, name = "min")
    int min() default 0;
    @OverridesAttribute(constraint = Size.class, name = "max")
    int max() default Integer.MAX_VALUE;

    // 重復(fù)注解
    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
    @Retention(RUNTIME)
    @Documented
    public @interface List {
        CollectionRange[] value();
    }
}

2、實(shí)現(xiàn)一個(gè)校驗(yàn)器
此例用不著(下面會(huì)有)
3、自定義錯(cuò)誤消息
當(dāng)然,你可以寫死在message屬性上,但是本處使用配置的方式來~

com.fsx.my.collection.message=[自定義消息]你的集合的長(zhǎng)度必須介于{min}和{max}之間(包含邊界值)

運(yùn)行案例:

@Getter
@Setter
@ToString
public class Person {
    @CollectionRange(min = 5, max = 10)
    private List numbers;
}

    // 測(cè)試用例
    public static void main(String[] args) {
        Person person = new Person();
        person.setNumbers(Arrays.asList(1, 2, 3));

        Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false)
                .buildValidatorFactory().getValidator();
        Set> result = validator.validate(person);

        // 輸出錯(cuò)誤消息
        result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue())
                .forEach(System.out::println);
    }

輸出校驗(yàn)信息如下(校驗(yàn)成功):

numbers [自定義消息]你的集合的長(zhǎng)度必須介于5和10之間(包含邊界值): [1, 2, 3]
組合約束

這塊比較簡(jiǎn)單,很多情況下一個(gè)字段是需要有多個(gè)約束(不為空且大于0)的。這個(gè)時(shí)候我們有兩種做法:

就在該屬性上標(biāo)注多個(gè)注解即可(推薦

自定義一個(gè)注解,把這些注解封裝起來,形成一個(gè)新的約束注解(使用場(chǎng)景相對(duì)較少)

自定義message消息==可使用的變量==

我們知道約束的失敗消息message里是可以使用{}占位符來動(dòng)態(tài)取值的,默認(rèn)情況下能夠取到約束注解里的所有屬性值,并且也只能取到那些屬性的值

but,有的時(shí)候?yàn)榱擞押谜故荆覀冃枰远xmessage里可取的值怎么辦呢?下面給個(gè)例子,讓大家知道怎么自定義可使用占位符的參數(shù)(備注:需要基于自定義注解):

自定義一個(gè)性別約束注解

@Documented
@Retention(RUNTIME)
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Constraint(validatedBy = {GenderConstraintValidator.class}) 
public @interface Gender {

    // 三個(gè)必備的基本屬性
    String message() default "{com.fsx.my.gender.message}";
    Class[] groups() default {};
    Class[] payload() default {};

    int gender() default 0; //0:男生  1:女生
}

配置的消息資源是:

com.fsx.my.gender.message=[自定義消息]此處只能允許性別為[{zhGenderValue}]的

很顯然,此處我們需要讀取zhGenderValue這個(gè)自定義的屬性值,并且希望它是中文。所以看看下面我實(shí)現(xiàn)的這個(gè)校驗(yàn)器吧:

public class GenderConstraintValidator implements ConstraintValidator {

    int genderValue;

    @Override
    public void initialize(Gender constraintAnnotation) {
        genderValue = constraintAnnotation.gender();
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        //添加參數(shù)  校驗(yàn)失敗的時(shí)候可用
        HibernateConstraintValidatorContext hibernateContext = context.unwrap(HibernateConstraintValidatorContext.class);
        hibernateContext.addMessageParameter("zhGenderValue", genderValue == 0 ? "男" : "女"); // 友好展示
        //hibernateContext.buildConstraintViolationWithTemplate("{zhGenderValue}").addConstraintViolation();

        if (value == null) {
            return false; // null is not valid
        }
        return value == genderValue;
    }
}

運(yùn)行單測(cè):

@Getter
@Setter
@ToString
public class Person {
    @Gender(gender = 0)
    private Integer personGender;
}

    public static void main(String[] args) {
        Person person = new Person();
        person.setPersonGender(1);

        Validator validator = Validation.byProvider(HibernateValidator.class).configure().failFast(false)
                .buildValidatorFactory().getValidator();
        Set> result = validator.validate(person);

        // 輸出錯(cuò)誤消息
        result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue())
                .forEach(System.out::println);
    }

打印如下:

personGender [自定義消息]此處只能允許性別為[男]的: 1

完美(效果達(dá)到)

總結(jié)

如果說前面文章是用機(jī),那這篇可以稱作是玩機(jī)了。Bean Validation是java官方定義的bean驗(yàn)證標(biāo)準(zhǔn),現(xiàn)在最新的版本為2.x,hibernate validator作為其標(biāo)準(zhǔn)實(shí)現(xiàn),對(duì)其進(jìn)行了擴(kuò)展,增加了多種約束,如果仍然不能滿足業(yè)務(wù)需求,我們還可以自定義約束。
數(shù)據(jù)校驗(yàn)Bean Validation這一大塊的內(nèi)容到此就告一段落了,希望講解的所有內(nèi)容能給你實(shí)際工作中帶來幫助,祝好~

知識(shí)交流
若文章格式混亂,可點(diǎn)擊:原文鏈接-原文鏈接-原文鏈接-原文鏈接-原文鏈接

==The last:如果覺得本文對(duì)你有幫助,不妨點(diǎn)個(gè)贊唄。當(dāng)然分享到你的朋友圈讓更多小伙伴看到也是被作者本人許可的~==

**若對(duì)技術(shù)內(nèi)容感興趣可以加入wx群交流:Java高工、架構(gòu)師3群
若群二維碼失效,請(qǐng)加wx號(hào):fsx641385712(或者掃描下方wx二維碼)。并且備注:"java入群" 字樣,會(huì)手動(dòng)邀請(qǐng)入群**

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75746.html

相關(guān)文章

  • 從深處去掌握數(shù)據(jù)校驗(yàn)@Valid作用(級(jí)聯(lián)校驗(yàn)

    摘要:如果說要使用數(shù)據(jù)校驗(yàn),我十分相信小伙伴們都能夠使用,但估計(jì)大都是有個(gè)前提的環(huán)境。具體使用可參考小家讓支持對(duì)平鋪參數(shù)執(zhí)行數(shù)據(jù)校驗(yàn)?zāi)J(rèn)使用只能對(duì)進(jìn)行校驗(yàn)級(jí)聯(lián)校驗(yàn)什么叫級(jí)聯(lián)校驗(yàn),其實(shí)就是帶校驗(yàn)的成員里存在級(jí)聯(lián)對(duì)象時(shí),也要對(duì)它完成校驗(yàn)。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術(shù) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(...

    BlackFlagBin 評(píng)論0 收藏0
  • 深入了解數(shù)據(jù)校驗(yàn)Bean Validation 2.0(JSR380)

    摘要:可能有人認(rèn)為數(shù)據(jù)校驗(yàn)?zāi)K并不是那么的重要,因?yàn)橛簿幋a都可以做。我以數(shù)據(jù)綁定為引子引出了數(shù)據(jù)校驗(yàn)這一塊,是想表明它的重要性。關(guān)于數(shù)據(jù)校驗(yàn)這塊,最新的是,也就是我們常說的。 每篇一句 吾皇一日不退役,爾等都是臣子 對(duì)Spring感興趣可掃碼加入wx群:Java高工、架構(gòu)師3群(文末有二維碼) 前言 前幾篇文章在講Spring的數(shù)據(jù)綁定的時(shí)候,多次提到過數(shù)據(jù)校驗(yàn)??赡苡腥苏J(rèn)為數(shù)據(jù)校驗(yàn)?zāi)K...

    wangtdgoodluck 評(píng)論0 收藏0
  • Spring方法級(jí)別數(shù)據(jù)校驗(yàn):@Validated + MethodValidationPostPr

    摘要:就這樣借助相關(guān)約束注解,就非常簡(jiǎn)單明了,語(yǔ)義清晰的優(yōu)雅的完成了方法級(jí)別入?yún)⑿r?yàn)返回值校驗(yàn)的校驗(yàn)。但倘若是返回值校驗(yàn)執(zhí)行了即使是失敗了,方法體也肯定被執(zhí)行了只能哪些類型上提出這個(gè)細(xì)節(jié)的目的是約束注解并不是能用在所有類型上的。 每篇一句 在《深度工作》中作者提出這么一個(gè)公式:高質(zhì)量產(chǎn)出=時(shí)間*專注度。所以高質(zhì)量的產(chǎn)出不是靠時(shí)間熬出來的,而是效率為王 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校...

    孫吉亮 評(píng)論0 收藏0
  • 讓Controller支持對(duì)平鋪參數(shù)執(zhí)行@Valid數(shù)據(jù)校驗(yàn)

    摘要:方案一借助對(duì)方法級(jí)別數(shù)據(jù)校驗(yàn)的能力首先必須明確一點(diǎn)此能力屬于框架的,而部分框架。 每篇一句 在金字塔塔尖的是實(shí)踐,學(xué)而不思則罔,思而不學(xué)則殆(現(xiàn)在很多編程框架都只是教你碎片化的實(shí)踐) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spr...

    printempw 評(píng)論0 收藏0
  • @Validated和@Valid區(qū)別?校驗(yàn)級(jí)聯(lián)屬性(內(nèi)部類)

    摘要:畢竟永遠(yuǎn)相信本文能給你帶來意想不到的收獲使用示例關(guān)于數(shù)據(jù)校驗(yàn)這一塊在中的使用案例,我相信但凡有點(diǎn)經(jīng)驗(yàn)的程序員應(yīng)該沒有不會(huì)使用的,并且還不乏熟練的選手。 每篇一句 NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術(shù) 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validati...

    Winer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<