当前位置: 首页 > news >正文

厦门网站建设格租车网站制作

厦门网站建设格,租车网站制作,网站360自然排名要怎么做,新手网站设计定价数据校验基础 参考#xff1a; Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator#xff0c;用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的#xff0c;这意味着它没有…数据校验基础 参考 Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的这意味着它没有跟web层或者数据访问层或者其余任何的某一个层次发生耦合。所以它能用于应用中的任意一个层次能对应用中的任意一个对象进行校验。 接口定义 public interface Validator {// 此clazz是否可以被validateboolean supports(Class? clazz);// 执行校验错误消息放在Errors中// 如果能执行校验通常也意味着supports方法返回true// 可以参考ValidationUtils这个工具类void validate(Object target, Errors errors); }接口实现 SmartValidator 对Validator接口进行了增强能进行分组校验。 public interface SmartValidator extends Validator {// validationHints就是启动的校验组// target需要校验的结果// errors封装校验void validate(Object target, Errors errors, Object... validationHints);// 假设value将被绑定到指定对象中的指定字段上并进行校验// since 5.1 这个方法子类需要复写 否则不能使用default void validateValue(Class? targetType, String fieldName, Nullable Object value, Errors errors, Object... validationHints) {throw new IllegalArgumentException(Cannot validate individual value for targetType);} } SpringValidatorAdapter SpringValidatorAdapter实现了对 Bean Validation的适配。 // 可以看到这个接口同时实现了Spring中的SmartValidator接口跟JSR中的Validator接口 public class SpringValidatorAdapter implements SmartValidator, javax.validation.Validator {//约束必须使用的3个属性private static final SetString internalAnnotationAttributes new HashSet(4);static {internalAnnotationAttributes.add(message);internalAnnotationAttributes.add(groups);internalAnnotationAttributes.add(payload);}// targetValidator就是实际完成校验的对象Nullableprivate javax.validation.Validator targetValidator;public SpringValidatorAdapter(javax.validation.Validator targetValidator) {Assert.notNull(targetValidator, Target Validator must not be null);this.targetValidator targetValidator;}SpringValidatorAdapter() {}void setTargetValidator(javax.validation.Validator targetValidator) {this.targetValidator targetValidator;}// 支持对所有类型的Bean的校验Overridepublic boolean supports(Class? clazz) {return (this.targetValidator ! null);}// 调用targetValidator完成校验并通过processConstraintViolations方法封装校验后的结果到Errors中Overridepublic void validate(Object target, Errors errors) {if (this.targetValidator ! null) {processConstraintViolations(this.targetValidator.validate(target), errors);}}// 完成分组校验Overridepublic void validate(Object target, Errors errors, Object... validationHints) {if (this.targetValidator ! null) {processConstraintViolations(this.targetValidator.validate(target, asValidationGroups(validationHints)), errors);}}// 完成对对象上某一个字段及给定值的校验SuppressWarnings(unchecked)Overridepublic void validateValue(Class? targetType, String fieldName, Nullable Object value, Errors errors, Object... validationHints) {if (this.targetValidator ! null) {processConstraintViolations(this.targetValidator.validateValue((Class) targetType, fieldName, value, asValidationGroups(validationHints)), errors);}}// since 5.1// 将validationHints转换成JSR中的分组private Class?[] asValidationGroups(Object... validationHints) {SetClass? groups new LinkedHashSet(4);for (Object hint : validationHints) {if (hint instanceof Class) {groups.add((Class?) hint);}}return ClassUtils.toClassArray(groups);}// 省略对校验错误的封装// .....// 省略对JSR中validator接口的实现都是委托给targetValidator完成的// ......} ValidatorAdapter 跟SpringValidatorAdapter同一级别的类但是不同的是他没有实现JSR中的Validator接口。一般不会使用这个类。 它实现了对 SmartValidator 的适配。 public class ValidatorAdapter implements SmartValidator, ApplicationContextAware, InitializingBean, DisposableBean {private final SmartValidator target;private final boolean existingBean;ValidatorAdapter(SmartValidator target, boolean existingBean) {this.target target;this.existingBean existingBean;}public final Validator getTarget() {return this.target;}Overridepublic boolean supports(Class? clazz) {return this.target.supports(clazz);}//... ... }CustomValidatorBean 配置一个bean暴露一个 JSR-303 Validator使用了 JSR 的3个接口。 public class CustomValidatorBean extends SpringValidatorAdapter implements Validator, InitializingBean {Nullableprivate ValidatorFactory validatorFactory;Nullableprivate MessageInterpolator messageInterpolator;Nullableprivate TraversableResolver traversableResolver; }LocalValidatorFactoryBean OptionalValidatorFactoryBean 继承了LocalValidatorFactoryBean区别在于让校验器的初始化成为可选的即使校验器没有初始化成功也不会报错。 Validated跟Valid的区别 定义 Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) Documented public interface Validated {// 校验时启动的分组Class?[] value() default {}; } Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE }) Retention(RUNTIME) Documented public interface Valid {//没有提供任何属性 } 区别 来源不同Valid是JSR的规范来源于javax.validation包下而Validated是Spring自身定义的注解位于org.springframework.validation.annotation包下 作用范围不同Validated无法作用在字段上正因为如此它就无法完成对级联属性的校验。而Valid的没有这个限制。 注解中的属性不同Validated注解中可以提供一个属性去指定校验时采用的分组而Valid没有这个功能因为Valid不能进行分组校验 应用 准备 待校验的类 Data public class ValidatedData {NotNullpublic String name;Positivepublic Integer age;NotNullNotEmptyprivate ListEmail String emails;/*** 定义的2个组以接口的形式*/public interface GroupA {}public interface GroupB {}}/*** 外部验证数据用于级联验证** author lihz* date 2023/2/18*/ Data public class OuterValidatedData {NotNullString name;ValidValidatedData validatedData; } 测试Controller package com.jurassic.cloud.project.controller;import com.jurassic.cloud.project.dto.OuterValidatedData; import com.jurassic.cloud.project.dto.ValidatedData; import com.jurassic.cloud.project.service.impl.ValidationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank;RestController RequestMapping(/validate) public class ValidationController {AutowiredValidationService validationService;PostMapping(/valid)public String testValid(RequestBody Valid ValidatedData data) {System.out.println(data);return OK;}PostMapping(/validated)public String testValidated(RequestBody Validated ValidatedData data) {System.out.println(data);return OK;}PostMapping(/valid/nest)public String testValidNest(RequestBody Valid OuterValidatedData data) {System.out.println(data);return OK;}PostMapping(/validated/nest)public String testValidatedNest(RequestBody Validated OuterValidatedData data) {System.out.println(data);return OK;}PostMapping(/valid/method)public String testValidMethod(RequestBody ValidatedData data) {validationService.testValid(data);return OK;}PostMapping(/validated/method)public String testValidatedMethod(RequestBody ValidatedData data) {validationService.testValidated(data);return OK;}PostMapping(/valid/nest/method)public String testValidNestMethod(RequestBody OuterValidatedData data) {validationService.testValidNest(data);return OK;}PostMapping(/validated/nest/method)public String testValidatedNestMethod(RequestBody OuterValidatedData data) {validationService.testValidatedNest(data);return OK;}PostMapping(/valid/simple)public String testValid(Valid Max(10) int age, Valid NotBlank String name) {System.out.println(age name);return OK;}PostMapping(/validated/simple)public String testValidated(Validated Max(10) int age, Validated NotBlank String name) {System.out.println(age name);return OK;}PostMapping(/non/method/simple)public String testNonMethodSimple(Max(10) int age, NotBlank String name) {validationService.testNon(age, name);return OK;}PostMapping(/valid/method/simple)public String testValidMethodSimple(Max(10) int age, NotBlank String name) {validationService.testValid(age, name);return OK;}PostMapping(/validated/method/simple)public String testValidatedMethodSimple(Max(10) int age, NotBlank String name) {validationService.testValidated(age, name);return OK;} } 测试数据 {name: demon,age: -1,emails: [demon7552003hotmail.com] }{name: xxxxx,data: {name: demon,age: -1,emails: [demon7552003hotmail.com]} } 测试服务 package com.jurassic.cloud.project.service.impl;import com.jurassic.cloud.project.dto.OuterValidatedData; import com.jurassic.cloud.project.dto.ValidatedData; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated;import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.NotBlank;/***** author lihz* date 2023/2/18*/ Service //Validated Valid public class ValidationService {public void testValid(Valid ValidatedData data) {System.out.println(data);}public void testValidated(Validated ValidatedData data) {System.out.println(data);}public void testValidNest(Valid OuterValidatedData data) {System.out.println(data);}public void testValidatedNest(Validated OuterValidatedData data) {System.out.println(data);}public void testNon( Max(10) int age, NotBlank String name) {System.out.println(age name);}public void testValid(Valid Max(10) int age,Valid NotBlank String name) {System.out.println(age name);}public void testValidated(Validated Max(10) int age, Validated NotBlank String name) {System.out.println(age name);}} 对JavaBean的校验(Controller层) 测试结果 valid测试 {code: 1,// age 必须是正数msg: Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValid(com.jurassic.cloud.project.dto.ValidatedData): [Field error in object validatedData on field age: rejected value [-1]; codes [Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [validatedData.age,age]; arguments []; default message [age]]; default message [必须是正数]] ,data: null }validated测试 {code: 1,msg: Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidated(com.jurassic.cloud.project.dto.ValidatedData): [Field error in object validatedData on field age: rejected value [-1]; codes [Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [validatedData.age,age]; arguments []; default message [age]]; default message [必须是正数]] ,data: null }valid测试 嵌套数据 {code: 1,msg: Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidNest(com.jurassic.cloud.project.dto.OuterValidatedData): [Field error in object outerValidatedData on field validatedData.age: rejected value [-1]; codes [Positive.outerValidatedData.validatedData.age,Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [outerValidatedData.validatedData.age,validatedData.age]; arguments []; default message [validatedData.age]]; default message [必须是正数]] ,data: null }validated测试 嵌套数据 {code: 1,msg: Validation failed for argument [0] in public java.lang.String com.jurassic.cloud.project.controller.ValidationController.testValidatedNest(com.jurassic.cloud.project.dto.OuterValidatedData): [Field error in object outerValidatedData on field validatedData.age: rejected value [-1]; codes [Positive.outerValidatedData.validatedData.age,Positive.validatedData.age,Positive.age,Positive.java.lang.Integer,Positive]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [outerValidatedData.validatedData.age,validatedData.age]; arguments []; default message [validatedData.age]]; default message [必须是正数]] ,data: null }总结 从结果上看 Valid 和 Validated 都能触发级联验证。 如果要触发属性的级联验证一定要放注解 Valid。 对普通方法的JavaBean校验 测试结果 Service类上不加注解 valid测试 OKvalidated测试 okvalid测试 嵌套数据 OKvalidated测试 嵌套数据 OKService类上加Valid valid测试 OKvalidated测试 okvalid测试 嵌套数据 OKvalidated测试 嵌套数据 OKService类上加Validated valid测试 {code: 1,msg: testValid.data.age: 必须是正数,data: null }validated测试 okvalid测试 嵌套数据 {code: 1,msg: testValidNest.data.validatedData.age: 必须是正数,data: null }validated测试 嵌套数据 OK总结 只有类上添加了Vlidated注解并且待校验的**JavaBean上添加了Valid**的情况下校验才会生效。 返回的异常信息包含了 进行验证的方法的名称以及验证的属性。 对简单参数的校验(Controller层) 测试结果 1、测试http://127.0.0.1:8073/validate/valid/simple?age20namedemon 结果OK 2、测试http://127.0.0.1:8073/validate/validated/simple?age20namedemon 结果OK 结论 参数上不论加 Valid 还是 Validated 都不会触发验证。 对简单参数的校验(Service层) 测试结果 1、测试http://127.0.0.1:8073/validate/valid/simple?age20namedemon 结果OK 2、测试http://127.0.0.1:8073/validate/validated/simple?age20namedemon 结果OK 结论 参数上不论加 Valid 还是 Validated 都不会触发验证。 对普通方法上的简单参数的校验(Service层) 1、参数不加注解 http://127.0.0.1:8073/validate/non/method/simple?age20 2、参数加Valid http://127.0.0.1:8073/validate/valid/simple?age20 3、参数加Validatedhttp://127.0.0.1:8073/validate/validated/simple?age20 测试结果 Service类上不加注解 1、OK 2、OK 3、OK Service类上加Valid 1、OK 2、OK 3、OK Service类上加Validated 1、 {code: 1,msg: testNon.age: 最大不能超过10, testNon.name: 不能为空,data: null }2、 {code: 1,msg: testValid.name: 不能为空, testValid.age: 最大不能超过10,data: null }3、 {code: 1,msg: testValidated.age: 最大不能超过10, testValidated.name: 不能为空,data: null }结论 参数上不论加 Valid 还是 Validated或者不加 都不会影响结果。 仅在类上加 Validated 时才会触发简单参数的验证。 普通方法验证的总结 仅在类上加Validated 时才会触发参数的验证。对于非简单类的验证必须加 Valid 触发级联验证。 Controller层验证的总结 仅能验证非简单类型。 从结果上看 Valid 和 Validated 都能触发级联验证。 如果要触发属性的级联验证一定要放注解 Valid。 Spring对JSR的适配 在普通方法上的验证抛出异常ConstraintViolationException在Controller层抛出的异常是MethodArgumentNotValidException。Spring对参数绑定做了封装错误信息被封装为BindingResult在方法RequestResponseBodyMethodProcessor#resolveArgument中做处理。 全局异常处理 通过RestControllerAdvice 做AOP。 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(错误字段%s错误值%s原因%s, field, value, msg);stringBuilder.append(message).append(\r\n);}return Result.error(MsgDefinition.ILLEGAL_ARGUMENTS.codeOf(), stringBuilder.toString());} } 附录 参考 官网https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/spring-framework-reference/core.html#validation-beanvalidation
文章转载自:
http://www.morning.tlyms.cn.gov.cn.tlyms.cn
http://www.morning.vaqmq.cn.gov.cn.vaqmq.cn
http://www.morning.yydzk.cn.gov.cn.yydzk.cn
http://www.morning.ckfqt.cn.gov.cn.ckfqt.cn
http://www.morning.ydrml.cn.gov.cn.ydrml.cn
http://www.morning.jsphr.cn.gov.cn.jsphr.cn
http://www.morning.llthz.cn.gov.cn.llthz.cn
http://www.morning.fkgqn.cn.gov.cn.fkgqn.cn
http://www.morning.hxbps.cn.gov.cn.hxbps.cn
http://www.morning.fbrshjf.com.gov.cn.fbrshjf.com
http://www.morning.zlces.com.gov.cn.zlces.com
http://www.morning.cwwts.cn.gov.cn.cwwts.cn
http://www.morning.thrtt.cn.gov.cn.thrtt.cn
http://www.morning.npmpn.cn.gov.cn.npmpn.cn
http://www.morning.kabaifu.com.gov.cn.kabaifu.com
http://www.morning.wknjy.cn.gov.cn.wknjy.cn
http://www.morning.bbgn.cn.gov.cn.bbgn.cn
http://www.morning.fstdf.cn.gov.cn.fstdf.cn
http://www.morning.kcdts.cn.gov.cn.kcdts.cn
http://www.morning.rfycj.cn.gov.cn.rfycj.cn
http://www.morning.cljmx.cn.gov.cn.cljmx.cn
http://www.morning.wfdlz.cn.gov.cn.wfdlz.cn
http://www.morning.jyzqn.cn.gov.cn.jyzqn.cn
http://www.morning.xfxqj.cn.gov.cn.xfxqj.cn
http://www.morning.mrskk.cn.gov.cn.mrskk.cn
http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn
http://www.morning.tzlfc.cn.gov.cn.tzlfc.cn
http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn
http://www.morning.pypbz.cn.gov.cn.pypbz.cn
http://www.morning.zcfsq.cn.gov.cn.zcfsq.cn
http://www.morning.plwfx.cn.gov.cn.plwfx.cn
http://www.morning.zmyhn.cn.gov.cn.zmyhn.cn
http://www.morning.wzknt.cn.gov.cn.wzknt.cn
http://www.morning.ksjnl.cn.gov.cn.ksjnl.cn
http://www.morning.darwallet.cn.gov.cn.darwallet.cn
http://www.morning.brzlp.cn.gov.cn.brzlp.cn
http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn
http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn
http://www.morning.qgtbx.cn.gov.cn.qgtbx.cn
http://www.morning.rknjx.cn.gov.cn.rknjx.cn
http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn
http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn
http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn
http://www.morning.prmbn.cn.gov.cn.prmbn.cn
http://www.morning.rycbz.cn.gov.cn.rycbz.cn
http://www.morning.xywfz.cn.gov.cn.xywfz.cn
http://www.morning.cytr.cn.gov.cn.cytr.cn
http://www.morning.nwczt.cn.gov.cn.nwczt.cn
http://www.morning.kkgbs.cn.gov.cn.kkgbs.cn
http://www.morning.syssdz.cn.gov.cn.syssdz.cn
http://www.morning.rmppf.cn.gov.cn.rmppf.cn
http://www.morning.zbpqq.cn.gov.cn.zbpqq.cn
http://www.morning.hmfxl.cn.gov.cn.hmfxl.cn
http://www.morning.lhxkl.cn.gov.cn.lhxkl.cn
http://www.morning.qxdrw.cn.gov.cn.qxdrw.cn
http://www.morning.jhyfb.cn.gov.cn.jhyfb.cn
http://www.morning.mmkrd.cn.gov.cn.mmkrd.cn
http://www.morning.pfbx.cn.gov.cn.pfbx.cn
http://www.morning.sfrw.cn.gov.cn.sfrw.cn
http://www.morning.hjsrl.cn.gov.cn.hjsrl.cn
http://www.morning.4q9h.cn.gov.cn.4q9h.cn
http://www.morning.cbmqq.cn.gov.cn.cbmqq.cn
http://www.morning.fhwfk.cn.gov.cn.fhwfk.cn
http://www.morning.zknxh.cn.gov.cn.zknxh.cn
http://www.morning.kqglp.cn.gov.cn.kqglp.cn
http://www.morning.nwfpl.cn.gov.cn.nwfpl.cn
http://www.morning.grbgn.cn.gov.cn.grbgn.cn
http://www.morning.wrbnh.cn.gov.cn.wrbnh.cn
http://www.morning.pmptm.cn.gov.cn.pmptm.cn
http://www.morning.nmkbl.cn.gov.cn.nmkbl.cn
http://www.morning.chehb.com.gov.cn.chehb.com
http://www.morning.dnbhd.cn.gov.cn.dnbhd.cn
http://www.morning.tturfsoc.com.gov.cn.tturfsoc.com
http://www.morning.lxjxl.cn.gov.cn.lxjxl.cn
http://www.morning.gbrdx.cn.gov.cn.gbrdx.cn
http://www.morning.hffjj.cn.gov.cn.hffjj.cn
http://www.morning.wklrz.cn.gov.cn.wklrz.cn
http://www.morning.fjscr.cn.gov.cn.fjscr.cn
http://www.morning.qsy41.cn.gov.cn.qsy41.cn
http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn
http://www.tj-hxxt.cn/news/272028.html

相关文章:

  • 怎样给自己做网站国家工信部网站备案查询
  • 设计网站无锡网页禁止访问怎么解除
  • 网站程上传营销型网站建设的利与弊
  • 货运代理网站模板wordpress上图片不显示
  • 广州网站推广策划吉安seo
  • 餐饮网站系统做设计找图片的网站有哪些
  • 营销型企业网站建设教案车载互联系统网站建设
  • 湟源县wap网站建设公司手机网站懒人模板
  • 如何小企业网站建设石家庄市网站制作价格
  • 自考大型网站开发工具怎么看 网站开发语言
  • 公司做的网站入哪个会计科目建筑资料网站大全
  • 网站开发 托管合同做网站黑吃黑是什么罪
  • 做任务拿赏金的网站搜狗站长平台验证不了
  • 临沂做商城网站设计网站做的支付宝接口吗
  • 网站建设成都公司手游app开发公司
  • 找婚庆公司去什么网站企业网站新模式
  • 沧州市科一网站vs开发网站开发教程
  • 中国建设银行嵊州市支行网站南京网站制作步骤
  • 霞浦县网站seo优化排名如何查询网站域名备案信息
  • 上海网站营销seowordpress修改数据库前缀
  • 建议网站的方案如何还原wordpress
  • 小企业网站建设的大品牌wordpress科技模板
  • 企业网站模板 演示免费建站还用学做网站吗
  • 如何修改网站后台地址wordpress原图片删除
  • 网站开发资讯怎么做潮牌网站
  • 一个人怎样做网站网络营销学什么内容
  • 网站开发框架排行广州公司建设网站
  • 做海报的素材哪个网站手机浏览器下载网页视频
  • 摄影网站官网大全建一个网站做cpa联盟
  • 公司网站页面设计越秀网站建设哪家好