當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring 的Databinder调用validator对controller参数进行验证的代码分析
生活随笔
收集整理的這篇文章主要介紹了
Spring 的Databinder调用validator对controller参数进行验证的代码分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
? ?org.springframework.validation.DataBinder,第473行,?this.getTarget()就是controller方法的參數(shù)對(duì)象:
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;}}這個(gè)validator默認(rèn)就是org.springframework.validation.beanvalidation.SpringValidatorAdapter,所以會(huì)跳到SpringValidatorAdapter的validate:
public void validate(@Nullable Object target, Errors errors) {if (this.targetValidator != null) {this.processConstraintViolations(this.targetValidator.validate(target, new Class[0]), errors);}}?
而下面這個(gè)方法完成從ConstraintViolation到FieldError的轉(zhuǎn)換,將violations轉(zhuǎn)成FieldError?列表輸出到error里,其實(shí)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,所以如果我們需要手動(dòng)調(diào)用驗(yàn)證器對(duì)pojo進(jìn)行驗(yàn)證的時(shí)候,可這樣寫:
/** 手動(dòng)調(diào)用驗(yàn)證器對(duì)對(duì)象實(shí)例進(jìn)行驗(yàn)證* 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 = "年齡應(yīng)該介乎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());}} }?
總結(jié)
以上是生活随笔為你收集整理的Spring 的Databinder调用validator对controller参数进行验证的代码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DataBinder.Eval方法研究
- 下一篇: 排序-ArrayList 排序