日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring 的Databinder调用validator对controller参数进行验证的代码分析

發布時間:2024/1/1 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 的Databinder调用validator对controller参数进行验证的代码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

? ?org.springframework.validation.DataBinder,第473行,?this.getTarget()就是controller方法的參數對象:

public void validate(Object... validationHints) {Iterator var2 = this.getValidators().iterator();while(true) {while(var2.hasNext()) {Validator validator = (Validator)var2.next();if (!ObjectUtils.isEmpty(validationHints) && validator instanceof SmartValidator) {((SmartValidator)validator).validate(this.getTarget(), this.getBindingResult(), validationHints);} else if (validator != null) {validator.validate(this.getTarget(), this.getBindingResult());}}return;}}

這個validator默認就是org.springframework.validation.beanvalidation.SpringValidatorAdapter,所以會跳到SpringValidatorAdapter的validate:

public void validate(@Nullable Object target, Errors errors) {if (this.targetValidator != null) {this.processConstraintViolations(this.targetValidator.validate(target, new Class[0]), errors);}}

?

而下面這個方法完成從ConstraintViolation到FieldError的轉換,將violations轉成FieldError?列表輸出到error里,其實error就是BindingResult.

protected void processConstraintViolations(Set<ConstraintViolation<Object>> violations, Errors errors) {Iterator var3 = violations.iterator();while(true) {ConstraintViolation violation;String field;FieldError fieldError;do {if (!var3.hasNext()) {return;}violation = (ConstraintViolation)var3.next();field = this.determineField(violation);fieldError = errors.getFieldError(field);} while(fieldError != null && fieldError.isBindingFailure());try {ConstraintDescriptor<?> cd = violation.getConstraintDescriptor();String errorCode = this.determineErrorCode(cd);Object[] errorArgs = this.getArgumentsForConstraint(errors.getObjectName(), field, cd);if (errors instanceof BindingResult) {BindingResult bindingResult = (BindingResult)errors;String nestedField = bindingResult.getNestedPath() + field;if ("".equals(nestedField)) {String[] errorCodes = bindingResult.resolveMessageCodes(errorCode);ObjectError error = new ObjectError(errors.getObjectName(), errorCodes, errorArgs, violation.getMessage());error.wrap(violation);bindingResult.addError(error);} else {Object rejectedValue = this.getRejectedValue(field, violation, bindingResult);String[] errorCodes = bindingResult.resolveMessageCodes(errorCode, field);FieldError error = new FieldError(errors.getObjectName(), nestedField, rejectedValue, false, errorCodes, errorArgs, violation.getMessage());error.wrap(violation);bindingResult.addError(error);}} else {errors.rejectValue(field, errorCode, errorArgs, violation.getMessage());}} catch (NotReadablePropertyException var15) {throw new IllegalStateException("JSR-303 validated property '" + field + "' does not have a corresponding accessor for Spring data binding - check your DataBinder's configuration (bean property versus direct field access)", var15);}}}

Springboot最終的validator是org.hibernate.validator.internal.engine.ValidatorFactoryImpl,所以如果我們需要手動調用驗證器對pojo進行驗證的時候,可這樣寫:

/** 手動調用驗證器對對象實例進行驗證* Created by rocklee on 2019/11/14 16:49*/ public class ValidatorTest {public static class Human{@NotEmptypublic String name;@NotNull@Range(min=0,max=200,message = "年齡應該介乎0至200歲")public Integer age;@NotNullpublic Integer sex;public List<@Valid Human> children;@NotNullpublic String[] t=null;public Human(){}public Human(String name,Integer age,Integer sex){this.name=name;this.age=age;this.sex=sex;children=new ArrayList<>();}}@Testpublic void testArray(){}@Testpublic void testValidate(){Human father=new Human("陳大文",35,1);father.children.add(new Human("陳小文",null,1));ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator= factory.getValidator();Set<ConstraintViolation<Human>> constraintViolations=validator.validate(father);for (ConstraintViolation<Human> c:constraintViolations){System.out.println(c.toString());}} }

?

總結

以上是生活随笔為你收集整理的Spring 的Databinder调用validator对controller参数进行验证的代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。