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

資訊專欄INFORMATION COLUMN

@Validated和@Valid的區(qū)別?校驗(yàn)級聯(lián)屬性(內(nèi)部類)

Winer / 3490人閱讀

摘要:畢竟永遠(yuǎn)相信本文能給你帶來意想不到的收獲使用示例關(guān)于數(shù)據(jù)校驗(yàn)這一塊在中的使用案例,我相信但凡有點(diǎn)經(jīng)驗(yàn)的程序員應(yīng)該沒有不會使用的,并且還不乏熟練的選手。

每篇一句
NBA里有兩大笑話:一是科比沒天賦,二是詹姆斯沒技術(shù)
相關(guān)閱讀

【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例
【小家Spring】讓Controller支持對平鋪參數(shù)執(zhí)行數(shù)據(jù)校驗(yàn)(默認(rèn)Spring MVC使用@Valid只能對JavaBean進(jìn)行校驗(yàn))
【小家Spring】Spring方法級別數(shù)據(jù)校驗(yàn):@Validated + MethodValidationPostProcessor優(yōu)雅的完成數(shù)據(jù)校驗(yàn)動作

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

前言

上篇文章 介紹了Spring環(huán)境下實(shí)現(xiàn)優(yōu)雅的方法級別的數(shù)據(jù)校驗(yàn),并且埋下一個(gè)伏筆:它在Spring MVCController層)里怎么應(yīng)用呢?本文為此繼續(xù)展開講解Spring MVC中的數(shù)據(jù)校驗(yàn)~

可能小伙伴能立馬想到:這不一樣嗎?我們使用Controller就是方法級別的,所以它就是直接應(yīng)用了方法級別的校驗(yàn)而已嘛~對于此疑問我先不解答,而是順勢再拋出兩個(gè)問題你自己應(yīng)該就能想明白了:

上文有說過,基于方法級別的校驗(yàn)Spring默認(rèn)是并未開啟的,但是為什么你在Spring MVC卻可以直接使用@Valid完成校驗(yàn)?zāi)兀?/p>

1. 可能有的小伙伴說他用的是`SpringBoot`可能默認(rèn)給開啟了,其實(shí)不然。哪怕你用的傳統(tǒng)`Spring MVC`你會發(fā)現(xiàn)也是直接可用的,不信你就試試

類比一下:Spring MVCHandlerInterceptorAOP思想的實(shí)現(xiàn),但你有沒有發(fā)現(xiàn)即使你沒有啟動@EnableAspectJAutoProxy的支持,它依舊好使~

若你能想明白我提出的這兩個(gè)問題,下文就非常不難理解了。當(dāng)然即使你知道了這兩個(gè)問題的答案,還是建議你讀下去。畢竟:永遠(yuǎn)相信本文能給你帶來意想不到的收獲~

使用示例

關(guān)于數(shù)據(jù)校驗(yàn)這一塊在Spring MVC中的使用案例,我相信但凡有點(diǎn)經(jīng)驗(yàn)的Java程序員應(yīng)該沒有不會使用的,并且還不乏熟練的選手。在此之前我簡單“采訪”過,絕大多數(shù)程序員甚至一度認(rèn)為Spring中的數(shù)據(jù)校驗(yàn)就是指的在Controller中使用@Validated校驗(yàn)入?yún)?b>JavaBean這一塊~

因此下面這個(gè)例子,你應(yīng)該一點(diǎn)都不陌生:

@Getter
@Setter
@ToString
public class Person {

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

    @Valid // 讓InnerChild的屬性也參與校驗(yàn)
    @NotNull
    private InnerChild child;

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

}

@RestController
@RequestMapping
public class HelloController {

    @PostMapping("/hello")
    public Object helloPost(@Valid @RequestBody Person person, BindingResult result) {
        System.out.println(result.getErrorCount());
        System.out.println(result.getAllErrors());
        return person;
    }
}

發(fā)送post請求:/hello Content-Type=application/json,傳入的json串如下:

{
  "name" : "fsx",
  "age" : "-1",
  "child" : {
    "age" : 1
  }
}

控制臺有如下打印:

2
[Field error in object "person" on field "child.name": rejected value [null]; codes [NotNull.person.child.name,NotNull.child.name,NotNull.name,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.child.name,child.name]; arguments []; default message [child.name]]; default message [不能為null], Field error in object "person" on field "age": rejected value [-1]; codes [Positive.person.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.age,age]; arguments []; default message [age]]; default message [必須是正數(shù)]]

從打印上看:校驗(yàn)生效(拿著錯(cuò)誤消息就可以返回前端展示,或者定位到錯(cuò)誤頁面都行)。

此例兩個(gè)小細(xì)節(jié)務(wù)必注意:

@RequestBody注解不能省略,否則傳入的json無法完成數(shù)據(jù)綁定(即使不綁定,校驗(yàn)也是生效的哦)~

若方法入?yún)⒉粚?b>BindingResult result這個(gè)參數(shù),請求得到的直接是400錯(cuò)誤,因?yàn)槿粲行r?yàn)失敗的服務(wù)端會拋出異常org.springframework.web.bind.MethodArgumentNotValidException。若寫了,那就調(diào)用者自己處理嘍~

據(jù)我不完全和不成熟的統(tǒng)計(jì),就這個(gè)案例就覆蓋了小伙伴們實(shí)際使用中的90%以上的真實(shí)使用場景,使用起來確實(shí)非常的簡單、優(yōu)雅、高效~

但是作為一個(gè)有豐富經(jīng)驗(yàn)的程序員的你,雖然你使用了@Valid優(yōu)雅的完成了數(shù)據(jù)校驗(yàn),但回頭是你是否還會發(fā)現(xiàn)你的代碼里還是存在了大量的if else的基礎(chǔ)的校驗(yàn)?什么原因?其實(shí)根本原因只有一個(gè):很多case使用@Valid并不能覆蓋,因?yàn)樗荒苄r?yàn)JavaBean
我相信你是有這樣那樣的使用痛點(diǎn)的,本文先從原理層面分析,進(jìn)而給出你所遇到的痛點(diǎn)問題的參考解決參考方案~

原理分析

Controller提供的使用@Valid便捷校驗(yàn)JavaBean的原理,和Spring方法級別的校驗(yàn)支持的原理是有很大差異的(可類比Spring MVC攔截器和Spring AOP的差異區(qū)別~),那么現(xiàn)在就看看這塊吧

請不要忽視優(yōu)雅代碼的力量,它會成倍提升你的編碼效率、成倍降低后期維護(hù)成本,甚至成倍提升你的擴(kuò)展性和成倍降低你寫bug的可能性~
回憶DataBinder/WebDataBinder

若對Spring數(shù)據(jù)綁定模塊不是很熟悉的(有閱讀過我之前文章的可忽略),建議先補(bǔ):

【小家Spring】聊聊Spring中的數(shù)據(jù)綁定 --- DataBinder本尊(源碼分析)

【小家Spring】聊聊Spring中的數(shù)據(jù)綁定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...

DataBinder類名叫數(shù)據(jù)綁定,但它在org.springframework.validation這個(gè)包,可見Spring它把數(shù)據(jù)綁定和數(shù)據(jù)校驗(yàn)牢牢的放在了一起,并且內(nèi)部弱化了數(shù)據(jù)校驗(yàn)的概念以及邏輯(Spring想讓調(diào)用者無需關(guān)心數(shù)據(jù)校驗(yàn)的細(xì)節(jié),全由它來自動完成,減少使用的成本)。

我們知道DataBinder它主要對外提供了bind(PropertyValues pvs)validate()方法,當(dāng)然還有處理綁定/校驗(yàn)失敗的相關(guān)(配置)組件:

public class DataBinder implements PropertyEditorRegistry, TypeConverter {
    ...
    @Nullable
    private AbstractPropertyBindingResult bindingResult; // 它是個(gè)BindingResult
    @Nullable
    private MessageCodesResolver messageCodesResolver;
    private BindingErrorProcessor bindingErrorProcessor = new DefaultBindingErrorProcessor();
    // 最重要是它:它是org.springframework.validation.Validator
    // 一個(gè)DataBinder 可以持有對個(gè)驗(yàn)證器。也就是說對于一個(gè)Bean,是可以交給多個(gè)驗(yàn)證器去驗(yàn)證的(當(dāng)然一般都只有一個(gè)即可而已~~~)
    private final List validators = new ArrayList<>();
    
    public void bind(PropertyValues pvs) {
        MutablePropertyValues mpvs = (pvs instanceof MutablePropertyValues ? (MutablePropertyValues) pvs : new MutablePropertyValues(pvs));
        doBind(mpvs);
    }
    ...
    public void validate() {
        Object target = getTarget();
        Assert.state(target != null, "No target to validate");
        BindingResult bindingResult = getBindingResult();
    
        // 拿到所有的驗(yàn)證器  一個(gè)個(gè)的對此target進(jìn)行驗(yàn)證~~~
        // Call each validator with the same binding result
        for (Validator validator : getValidators()) {
            validator.validate(target, bindingResult);
        }
    }
}

DataBinder提供了這兩個(gè)非常獨(dú)立的原子方法:綁定 + 校驗(yàn)。他倆結(jié)合完成了我們的數(shù)據(jù)綁定+數(shù)據(jù)校驗(yàn),完全的和業(yè)務(wù)無關(guān)~

網(wǎng)上有很多文章說DataBinder完成數(shù)據(jù)綁定后繼續(xù)校驗(yàn),這種說法是不準(zhǔn)確的呀,因?yàn)樗⒉惶幚磉@部分的組合邏輯,它只提供原始能力~
Spring MVC處理入?yún)⒌臅r(shí)機(jī)

Spring MVC處理入?yún)⒌倪壿嬍欠浅?fù)雜的,前面花大篇幅講了Spring MVC對返回值的處理器:HandlerMethodReturnValueHandler,詳見:
【小家Spring】Spring MVC容器的web九大組件之---HandlerAdapter源碼詳解---一篇文章帶你讀懂返回值處理器HandlerMethodReturnValueHandler

同樣的,本文只關(guān)注它對@RequestBody這種類型的入?yún)⑦M(jìn)行講解~
處理入?yún)⒌奶幚砥鳎?b>HandlerMethodArgumentResolver,處理@RequestBody最終使用的實(shí)現(xiàn)類是:RequestResponseBodyMethodProcessor,Spring借助此處理器完成一系列的消息轉(zhuǎn)換器、數(shù)據(jù)綁定、數(shù)據(jù)校驗(yàn)等工作~

RequestResponseBodyMethodProcessor

這個(gè)類應(yīng)該是陌生的,在上面推薦的處理MVC返回值的文章中有提到過它:它能夠處理@ResponseBody注解返回值(請參考它的supportsReturnType()方法~)
它還有另一個(gè)能力是:它能夠處理請求參數(shù)(當(dāng)然也是標(biāo)注了@RequestBody它的~)
所以它既是個(gè)處理返回值的HandlerMethodReturnValueHandler,有是一個(gè)處理入?yún)⒌?b>HandlerMethodArgumentResolver。所以它命名為Processor而不是Resolver/Handler嘛,這就是命名的藝術(shù)~

// @since 3.1
public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(RequestBody.class);
    }
    // 類上或者方法上標(biāo)注了@ResponseBody注解都行
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) || returnType.hasMethodAnnotation(ResponseBody.class));
    }
    
    // 這是處理入?yún)⒎庋b校驗(yàn)的入口,也是本文關(guān)注的焦點(diǎn)
    @Override
    public Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {
        
        // 它是支持`Optional`容器的
        parameter = parameter.nestedIfOptional();
        // 使用消息轉(zhuǎn)換器HttpInputMessage把request請求轉(zhuǎn)換出來
        // 此處注意:比如本例入?yún)⑹荘erson類,所以經(jīng)過這里處理會生成一個(gè)空的Person對象出來(反射)
        Object arg = readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());

        // 獲取到入?yún)⒌拿Q
        // 請注意:這里的名稱是類名首字母小寫,并不是你方法里寫的名字。比如本利若形參名寫為personAAA,但是name的值還是person
        String name = Conventions.getVariableNameForParameter(parameter);

        // 只有存在binderFactory才會去完成自動的綁定、校驗(yàn)~
        // 此處web環(huán)境為:ServletRequestDataBinderFactory
        if (binderFactory != null) {
            WebDataBinder binder = binderFactory.createBinder(webRequest, arg, name);

            // 顯然傳了參數(shù)才需要去綁定校驗(yàn)嘛
            if (arg != null) {

                // 這里完成數(shù)據(jù)綁定+數(shù)據(jù)校驗(yàn)~~~~~(綁定的錯(cuò)誤和校驗(yàn)的錯(cuò)誤都會放進(jìn)Errors里)
                // Applicable:適合
                validateIfApplicable(binder, parameter);

                // 若有錯(cuò)誤消息hasErrors(),并且僅跟著的一個(gè)參數(shù)不是Errors類型,Spring MVC會主動給你拋出MethodArgumentNotValidException異常
                // 否則,調(diào)用者自行處理
                if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
                    throw new MethodArgumentNotValidException(parameter, binder.getBindingResult());
                }
            }
        
            // 把錯(cuò)誤消息放進(jìn)去 證明已經(jīng)校驗(yàn)出錯(cuò)誤了~~~
            // 后續(xù)邏輯會判斷MODEL_KEY_PREFIX這個(gè)key的~~~~
            if (mavContainer != null) {
                mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX + name, binder.getBindingResult());
            }
        }

        return adaptArgumentIfNecessary(arg, parameter);
    }

    // 校驗(yàn),如果合適的話。使用WebDataBinder,失敗信息最終也都是放在它身上~  本方法是本文關(guān)注的焦點(diǎn)
    // 入?yún)ⅲ篗ethodParameter parameter
    protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {
        // 拿到標(biāo)注在此參數(shù)上的所有注解們(比如此處有@Valid和@RequestBody兩個(gè)注解)
        Annotation[] annotations = parameter.getParameterAnnotations();
        for (Annotation ann : annotations) {
            // 先看看有木有@Validated
            Validated validatedAnn = AnnotationUtils.getAnnotation(ann, Validated.class);

            // 這個(gè)里的判斷是關(guān)鍵:可以看到標(biāo)注了@Validated注解 或者注解名是以Valid打頭的 都會有效哦
            //注意:這里可沒說必須是@Valid注解。實(shí)際上你自定義注解,名稱只要一Valid開頭都成~~~~~
            if (validatedAnn != null || ann.annotationType().getSimpleName().startsWith("Valid")) {
                // 拿到分組group后,調(diào)用binder的validate()進(jìn)行校驗(yàn)~~~~
                // 可以看到:拿到一個(gè)合適的注解后,立馬就break了~~~
                // 所以若你兩個(gè)主機(jī)都標(biāo)注@Validated和@Valid,效果是一樣滴~
                Object hints = (validatedAnn != null ? validatedAnn.value() : AnnotationUtils.getValue(ann));
                Object[] validationHints = (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});
                binder.validate(validationHints);
                break;
            }
        }
    }
    ...
}

本文我們只著眼于關(guān)注@Valid的數(shù)據(jù)校驗(yàn)這塊,有幾個(gè)相關(guān)的使用小細(xì)節(jié),總結(jié)如下:

形參(@RequestBody標(biāo)注的入?yún)ⅲ┑?b>name(形參名)和你寫什么無關(guān),若是實(shí)體類名字就是類名首字母小寫。(若是數(shù)組、集合等,都會有自己特定的名稱)

@Validated@Valid都能使校驗(yàn)生效,但卻不僅僅是它哥倆才能行:任何名稱是"Valid"打頭的注解都能使得數(shù)據(jù)校驗(yàn)生效

    1. 自定義注解名稱以`Valid`開頭,并且給個(gè)`value`屬性同樣能夠指定`Group`分組
    2. 個(gè)人直接建議使用`@Validated`即可,而去使用`@Valid`了,更不用自己給自己找麻煩去自定義注解啥的了~

只有當(dāng)Errors(BindingResult)入?yún)⑹鞘莾H跟著@Valid注解的實(shí)體,Spring MVC才會把錯(cuò)誤消息放權(quán)交給調(diào)用者處理,否則(沒有或者不是緊挨著)它會拋出MethodArgumentNotValidException異常~

這是使用@RequestBody結(jié)合@Valid完成數(shù)據(jù)校驗(yàn)的基本原理。其實(shí)當(dāng)Spring MVC在處理@RequestPart注解入?yún)?shù)據(jù)時(shí),也會執(zhí)行綁定、校驗(yàn)的相關(guān)邏輯。對應(yīng)處理器是RequestPartMethodArgumentResolver,原理大體上和這相似,它主要處理Multipart相關(guān),本文忽略~

==此處提示一個(gè)點(diǎn),此文發(fā)出去后有一個(gè)好奇的小寶寶問我入?yún)⒛苁褂枚鄠€(gè)對象并且都用@RequestBody標(biāo)注嗎?==
關(guān)于這個(gè)問題姑且先不考慮合理與否,我們這樣做試試:

    @PostMapping("/hello")
    public Object helloPost(@Valid @RequestBody Person personAAA, BindingResult result, @Valid @RequestBody Person personBBB) {
        ...
    }

請求卻報(bào)錯(cuò)了:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed]

錯(cuò)誤消息很好理解:請求域的Body體是只能被讀取一次的(流只能被讀取一次嘛)。
若你是好奇的,你可能還會問:URL參數(shù)呢?請求鏈接?后面的參數(shù)呢,如何封裝???因?yàn)楸静糠謨?nèi)容不是本文的關(guān)注點(diǎn),若有興趣請出門左拐~

說明:關(guān)于使用Map、List、數(shù)組等接受@RequestBody參數(shù)的情況類似,區(qū)別在于綁定器上,對Map、List的校驗(yàn)前面文章有過講解,此處就不展開了。

希望讀者能掌握這部分內(nèi)容,因?yàn)樗兔嫦蚴褂谜弑容^重要的@InitBinder強(qiáng)關(guān)聯(lián)~~~

實(shí)際使用中一般使用@Validated分組校驗(yàn)(若需要),然后結(jié)合全局異常的處理方式來友好的對調(diào)用者展示錯(cuò)誤消息~

全局異常處理示例

當(dāng)校驗(yàn)失敗時(shí),Spring會拋出MethodArgumentNotValidException異常,該異常會持有校驗(yàn)結(jié)果對象BindingResult,從而獲得校驗(yàn)失敗信息。本處只給示例,僅供參考:

@RestControllerAdvice
public class MethodArgumentNotValidExceptionHandler {


    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
        BindingResult bindingResult = ex.getBindingResult();

        StringBuilder stringBuilder = new StringBuilder();
        for (FieldError error : bindingResult.getFieldErrors()) {
            String field = error.getField();
            Object value = error.getRejectedValue();
            String msg = error.getDefaultMessage();
            String message = String.format("錯(cuò)誤字段:%s,錯(cuò)誤值:%s,原因:%s;", field, value, msg);
            stringBuilder.append(message).append("
");
        }
        return Result.error(MsgDefinition.ILLEGAL_ARGUMENTS.codeOf(), stringBuilder.toString());
    }
}
遺留痛點(diǎn)

你是否發(fā)現(xiàn),雖然Spring MVC給我們提供了極其方便的數(shù)據(jù)校驗(yàn)方式,但是它還是有比較大的局限性的:它要求待校驗(yàn)的入?yún)⑹荍avaBean

請注意:并不一樣要求是請求Body體哦,比如get請求的入?yún)⑷粲肑avaBean接收的話,依舊能啟用校驗(yàn)

但在實(shí)際應(yīng)用中,其實(shí)我們非常多的Controller方法的方法入?yún)⑹?b>平鋪的,也就是所謂的平鋪參數(shù),形如這樣:

    @PutMapping("/hello/id/{id}/status/{status}")
    public Object helloGet(@PathVariable Integer id, @PathVariable Integer status) {
        ...
        return "hello world";
    }

其實(shí),特別是get請求的case,@RequestParam入?yún)⒁话闶欠浅6嗟模ū热绶猪摬樵儯y道對于這種平鋪參數(shù)的case,我們真的是能通過人肉if else的去校驗(yàn)嗎?
興許你對此問題有興趣,那就參閱本文吧,它能給你提供解決方案:【小家Spring】讓Controller支持對平鋪參數(shù)執(zhí)行數(shù)據(jù)校驗(yàn)(默認(rèn)Spring MVC使用@Valid只能對JavaBean進(jìn)行校驗(yàn))

==@Validated和@Valid的區(qū)別==

如題的問題,我相信是很多小伙伴都很關(guān)心的一個(gè)對比,若你把這個(gè)系列都有喵過,那么這個(gè)問題的答案就浮出水面了:

@Valid:標(biāo)準(zhǔn)JSR-303規(guī)范的標(biāo)記型注解,用來標(biāo)記驗(yàn)證屬性和方法返回值,進(jìn)行級聯(lián)和遞歸校驗(yàn)

@ValidatedSpring的注解,是標(biāo)準(zhǔn)JSR-303的一個(gè)變種(補(bǔ)充),提供了一個(gè)分組功能,可以在入?yún)Ⅱ?yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制

Controller中校驗(yàn)方法參數(shù)時(shí),使用@Valid和@Validated并無特殊差異(若不需要分組校驗(yàn)的話)

@Validated注解可以用于類級別,用于支持Spring進(jìn)行方法級別的參數(shù)校驗(yàn)。@Valid可以用在屬性級別約束,用來表示級聯(lián)校驗(yàn)。

@Validated只能用在類、方法和參數(shù)上,而@Valid可用于方法、字段、構(gòu)造器和參數(shù)上

最后提示一點(diǎn):Spring BootWeb Starter已經(jīng)加入了Bean Validation以及實(shí)現(xiàn)的依賴,可以直接使用。但若是純Spring MVC環(huán)境,請自行導(dǎo)入~
總結(jié)

本文介紹的是我們平時(shí)使用得最多的數(shù)據(jù)校驗(yàn)場景:使用@Validated完成Controller的入?yún)⑿r?yàn),實(shí)現(xiàn)優(yōu)雅的處理數(shù)據(jù)校驗(yàn)。同時(shí)希望通過本文能讓你徹底弄懂@Validated和@Valid使用上的區(qū)別以及聯(lián)系,在實(shí)際生產(chǎn)使用中能夠做到更加的得心應(yīng)手~

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

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

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

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

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

相關(guān)文章

  • 讓Controller支持對平鋪參數(shù)執(zhí)行@Valid數(shù)據(jù)校驗(yàn)

    摘要:方案一借助對方法級別數(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 評論0 收藏0
  • Spring方法級別數(shù)據(jù)校驗(yàn):@Validated + MethodValidationPostPr

    摘要:就這樣借助相關(guān)約束注解,就非常簡單明了,語義清晰的優(yōu)雅的完成了方法級別入?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ù)校...

    孫吉亮 評論0 收藏0
  • 從深處去掌握數(shù)據(jù)校驗(yàn)@Valid作用(級聯(lián)校驗(yàn)

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

    BlackFlagBin 評論0 收藏0
  • Bean Validation完結(jié)篇:你必須關(guān)注邊邊角角(約束級聯(lián)、自定義約束、自定義校驗(yàn)器、國際

    摘要:和上標(biāo)注的約束都會被執(zhí)行注意如果子類覆蓋了父類的方法,那么子類和父類的約束都會被校驗(yàn)。 每篇一句 沒有任何技術(shù)方案會是一種銀彈,任何東西都是有利弊的 相關(guān)閱讀 【小家Java】深入了解數(shù)據(jù)校驗(yàn):Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】Spring方法級別數(shù)據(jù)校...

    niuxiaowei111 評論0 收藏0
  • 參數(shù)驗(yàn)證 @Validated @Valid 區(qū)別

    摘要:也就是說如果傳的中有的為空或者是負(fù)數(shù),入?yún)Ⅱ?yàn)證不會檢測出來。為了能夠進(jìn)行嵌套驗(yàn)證,必須手動在實(shí)體的字段上明確指出這個(gè)字段里面的實(shí)體也要進(jìn)行驗(yàn)證。用在方法入?yún)⑸蠠o法單獨(dú)提供嵌套驗(yàn)證功能。 來源:blog.csdn.net/qq_27680317/article/details/79970590整編:Java技術(shù)棧(公眾號ID:javastack) Spring Validation驗(yàn)證框...

    lieeps 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<