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

郑州网站建设moran濮阳网络电视台

郑州网站建设moran,濮阳网络电视台,湖南常德今天最新消息,项目建设目标怎么写文章目录 参数校验- Validation- Hibernate Validator 校验注解注解通用属性- Validator 内置注解- Hibernate Validator 附加注解 校验开启Valid和Validated 校验分类- Controller校验- Spring Bean校验 校验使用- Controller#xff1a;参数对象校验- Spring Bean#xff1… 文章目录 参数校验- Validation- Hibernate Validator 校验注解注解通用属性- Validator 内置注解- Hibernate Validator 附加注解 校验开启Valid和Validated 校验分类- Controller校验- Spring Bean校验 校验使用- Controller参数对象校验- Spring Bean方法返回值对象校验- Spring Bean方法参数对象校验分组校验- Controller方法参数分组校验 嵌套校验- Controller方法参数嵌套校验- Spring Bean方法返回值嵌套校验- Spring Bean方法参数嵌套校验 自定义注解 参数校验 Spring Boot框架默认使用Hibernate Validator作为校验器实现。参数校验使用JSR-303规范定义的校验注解来实现的。 实际上在Spring项目中参数校验并仅支持用在Controller层上面其实是支持用在所有的Spring Bean上Controller、Service、Repository等。 配置依赖 SpringMVC项目 dependencygroupIdorg.hibernate.validator/groupIdartifactIdhibernate-validator/artifactIdversion6.0.18.Final/version /dependencySpringBoot项目 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId /dependency- Validation javax.validation 并不是 JDK 的一部分它是 Java EE 的一部分它提供了基于注释和 API 的对象校验功能即 JSR 303 规范。JSR 303 规范定义了一套用于在 JavaBean 中定义验证约束的元数据模型并提供用于编程方式和声明式验证的 API。 在 JavaEE6 中这个规范被定义为 JSR 303在 JavaEE7 中则成为了 JSR 349在 JavaEE8 中成为 JSR 380 javax.validation 包中包含了很多注解如NotNull、Size、Pattern它们可以用来对 JavaBean 中的属性进行各种验证以保证数据的有效性和安全性。 需要注意的是虽然 JSR-303 规范是 Java EE 的一部分但我们仍然可以在非 Java EE 的应用程序中使用它例如 Spring Boot、Spring MVC 等。在使用时需要导入 javax.validation 的 jar 包或者其他支持JSR 303规范的第三方库。 - Hibernate Validator hibernate-validator是一个流行的Java数据校验器库它基于JSR 303规范实现了Bean Validation 2.0 API并提供了许多常用的校验注解和校验器。 校验注解 注解通用属性 message错误提示信息 可以使用 {} 占位符来引用注解中的属性值或自定义的文本。可以在错误消息中动态地插入变量的值使错误消息更具体和有意义。 使用方式 自定义文本Size(min 5, max 10, message 用户名长度不正确) private String username;引用注解中的属性值Size(min 5, max 10, message 用户名长度必须介于 {min} 到 {max} 之间) private String username;引用配置文件配置参数的值Size(min 5, max 10, message {javax.validation.constraints.Size.message}) private String username;为了提供国际化和本地化支持错误消息通常会使用特定的键key来标识。这些键将在校验过程中与消息资源包message bundle中的实际错误消息文本进行映射。 groups所属的校验组 校验组是一种逻辑分组可以根据不同的场景或需求对校验规则进行分组。默认情况下参数校验不属于任何校验组即属于默认组Default。 payload携带额外的信息负载 这些信息负载可以在校验失败时获得。通常情况下我们不需要使用该属性。 - Validator 内置注解 注解注解的其它属性注解描述Null验证对象是否为 nullNotNull验证对象不为 nullNotBlank验证字符串不为空去除前后空格后长度大于 0NotEmpty验证对象不为 null 且不为空如字符串、集合、数组等去除前后空格后长度大于 0Sizemin最小值max最大值验证对象字符串、集合、数组等长度在 min 和 max 之间Maxvalue最大值验证数值byte、short、int、long 等是否小于等于指定的最大值Minvalue最小值验证数值byte、short、int、long 等是否大于等于指定的最小值DecimalMaxvalue最大值inclusive是否包含边界验证 BigDecimal 和 BigInteger 的值是否小于等于指定的最大值DecimalMinvalue最小值inclusive是否包含边界验证 BigDecimal 和 BigInteger 的值是否大于等于指定的最小值Digitsinteger整数位数fraction小数位数验证数值是否符合整数位数和小数位数要求Patternregexp正则表达式验证字符串是否符合指定的正则表达式Email验证字符串是否符合 Email 格式Future验证日期是否为将来某个时间FutureOrPresent验证日期是否为将来某个时间或当前时间Past验证日期是否为过去某个时间PastOrPresent验证日期是否为过去某个时间或当前时间AssertTrue验证 boolean 类型是否为 trueAssertFalse验证 boolean 类型是否为 falsePositive验证数值是否为正数PositiveOrZero验证数值是否为正数或零Negative验证数值是否为负数NegativeOrZero验证数值是否为负数或零 Max(value)、Min(value)、DecimalMax(value)、DecimalMin(Value)区别 Max、Min接受一个Long类型的值DecimalMax、DecimalMin接受一个字符串类型的值BigDecimal的字符串表示形式因此可以是小数数字超过Long.MAX_VALUE或Long.MIN_VALUE以下或者数字是小数DecimalMax、DecimalMin是唯一的选择。 - Hibernate Validator 附加注解 注解注解的其它属性注解描述Lengthmin最小长度max最大长度验证字符串的长度是否在指定范围内Rangemin最小值max最大值验证数字(BigDecimal, BigInteger, String, byte, short, int, long和原始类型的包装类 )是否在指定范围内UniqueElements验证集合中的元素是否唯一URLprotocol协议host主机port端口regexp正则表达式flags标志验证字符串是否符合 URL 格式要求Hexadecimal验证字符串是否是十六进制的格式ISBNtypeISBN类型验证字符串是否是有效的ISBN码CreditCardNumberignoreNonDigitCharacters是否忽略非数字字符验证字符串是否是有效的信用卡号码Currencyvalue货币代码验证字符串是否是有效的货币代码CodePointLengthmin最小码点长度max最大码点长度验证字符串的码点长度是否在指定范围内Mod10Check验证字符串是否通过Mod 10算法校验Mod11Check验证字符串是否通过Mod 11算法校验LuhnCheck验证字符串是否通过Luhn算法校验EANtypeEAN 类型验证字符串是否是有效的 EAN欧洲文章编号码ScriptAssertlang脚本语言script脚本内容alias脚本别名reportOn指定将错误报告应用于哪些属性验证对象的属性是否满足指定的脚本表达式ParameterScriptAssertlang脚本语言script脚本内容验证对象的属性是否满足指定的脚本表达式可以在脚本中引用方法参数 校验开启 Valid和Validated是用于Spring框架中数据校验的注解。 Valid和Validated 对比ValidValidated校验规则JavaEE JSR-303Bean Validation规范定义的Spring定义的对Valid进行了二次封装。所以既支持使用JSR-303规范的注解也可以使用Spring提供的额外校验规则使用范围用在方法、参数、字段上用在类、参数上分组校验不支持支持嵌套校验支持需要在嵌套的字段上面也加上Valid不支持异常处理校验失败时抛出异常MethodArgumentNotValidException校验失败时抛出异常ConstraintViolationException 校验分类 Spring支持校验范围可分为以下两类 Controller校验Spring Bean校验包括Controller - Controller校验 Spring对Controller层的参数校验进行了专门处理当请求到达Controller层前会先找到匹配的方法参数解析器HandlerMethodArgumentResolver进行参数解析参数解析的过程中包含参数校验。 HandlerMethodArgumentResolver分析可参考https://blog.csdn.net/JokerLJG/article/details/134754757 源码分析 HandlerMethodArgumentResolver接口 public interface HandlerMethodArgumentResolver {// 判断该解析器是否支持解析给定的方法参数boolean supportsParameter(MethodParameter parameter);// 解析给定的方法参数并返回解析后的参数值Object resolveArgument(MethodParameter parameter, Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, Nullable WebDataBinderFactory binderFactory) throws Exception; }下面以HandlerMethodArgumentResolver的其中一个实现类来分析。 RequestResponseBodyMethodProcessor类 Overridepublic Object resolveArgument(MethodParameter parameter, Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, Nullable WebDataBinderFactory binderFactory) throws Exception {parameter parameter.nestedIfOptional();Object arg readWithMessageConverters(webRequest, parameter, parameter.getNestedGenericParameterType());String name Conventions.getVariableNameForParameter(parameter);if (binderFactory ! null) {WebDataBinder binder binderFactory.createBinder(webRequest, arg, name);if (arg ! null) {validateIfApplicable(binder, parameter);if (binder.getBindingResult().hasErrors() isBindExceptionRequired(binder, parameter)) {throw new MethodArgumentNotValidException(parameter, binder.getBindingResult());}}if (mavContainer ! null) {mavContainer.addAttribute(BindingResult.MODEL_KEY_PREFIX name, binder.getBindingResult());}}return adaptArgumentIfNecessary(arg, parameter);}protected void validateIfApplicable(WebDataBinder binder, MethodParameter parameter) {// 遍历方法参数上的注解Annotation[] annotations parameter.getParameterAnnotations();for (Annotation ann : annotations) {// 如果注解是Validated或注解以Valid开头时进行参数校验Validated validatedAnn AnnotationUtils.getAnnotation(ann, Validated.class);if (validatedAnn ! null || ann.annotationType().getSimpleName().startsWith(Valid)) {Object hints (validatedAnn ! null ? validatedAnn.value() : AnnotationUtils.getValue(ann));Object[] validationHints (hints instanceof Object[] ? (Object[]) hints : new Object[] {hints});binder.validate(validationHints);break;}}}获取方法参数上的所有注解遍历注解当注解是Validated或注解以Valid开头时进行参数校验 - Spring Bean校验 Spring Bean校验底层是通过AOP的方式实现的通过MethodValidationPostProcessor动态注册AOP切面以Validated注解为切点然后使用MethodValidationInterceptor对切点方法织入增强。 注意Spring Bean校验对Controller及其他Spring Bean都适用。 MethodValidationPostProcessor类 public void afterPropertiesSet() {// 为所有Validated标注的Bean创建切面Pointcut pointcut new AnnotationMatchingPointcut(this.validatedAnnotationType, true);// 创建Advisor进行增强this.advisor new DefaultPointcutAdvisor(pointcut, createMethodValidationAdvice(this.validator));}// 创建Advice本质就是一个方法拦截器拦截Bean的所有方法protected Advice createMethodValidationAdvice(Nullable Validator validator) {return (validator ! null ? new MethodValidationInterceptor(validator) : new MethodValidationInterceptor());}MethodValidationInterceptor类 OverrideSuppressWarnings(unchecked)public Object invoke(MethodInvocation invocation) throws Throwable {// 无需增强的方法直接跳过if (isFactoryBeanMetadataMethod(invocation.getMethod())) {return invocation.proceed();}// 获取校验分组信息Class?[] groups determineValidationGroups(invocation);ExecutableValidator execVal this.validator.forExecutables();Method methodToValidate invocation.getMethod();SetConstraintViolationObject result;// 方法参数校验try {result execVal.validateParameters(invocation.getThis(), methodToValidate, invocation.getArguments(), groups);} catch (IllegalArgumentException ex) {methodToValidate BridgeMethodResolver.findBridgedMethod(ClassUtils.getMostSpecificMethod(invocation.getMethod(), invocation.getThis().getClass()));result execVal.validateParameters(invocation.getThis(), methodToValidate, invocation.getArguments(), groups);}if (!result.isEmpty()) {throw new ConstraintViolationException(result);}Object returnValue invocation.proceed();// 方法返回值校验result execVal.validateReturnValue(invocation.getThis(), methodToValidate, returnValue, groups);if (!result.isEmpty()) {throw new ConstraintViolationException(result);}return returnValue;}方法参数校验当方法参数上有Valid或参数校验注解NotNull、NotBlank、Length等时会进行校验。方法返回值校验当方法参数上有Valid或参数校验注解NotNull、NotBlank、Length等时会进行校验。 校验使用 校验分类校验范围Controller方法参数对象校验Controller适用Spring Bean方法返回值对象校验Controller及其他Spring Bean都适用Spring Bean方法参数对象校验Controller及其他Spring Bean都适用 注意下面的示例中项目做了全局异常处理。 - Controller参数对象校验 对Controller方法参数对象进行校验。 Data public class User {NotNull(message userId不能为空)public String userId; }使用Valid校验注解 方法参数上加Valid参数对象中使用校验注解 代码 RestController RequestMapping(valid) public class ValidController {PostMapping(test11)public User test11(RequestBody Valid User user) {return user;} }请求 curl http://127.0.0.1:8888/valid/test11 -H Content-Type: application/json -d {}结果 {code: 501,msg: userId不能为空,data: null }使用Validated校验注解 方法参数上加Validated参数对象中使用校验注解 代码 RestController RequestMapping(valid) public class ValidController {PostMapping(test12)public User test12(RequestBody Validated User user) {return user;} }请求 curl http://127.0.0.1:8888/valid/test12 -H Content-Type: application/json -d {}结果 {code: 501,msg: userId不能为空,data: null }- Spring Bean方法返回值对象校验 对Spring Bean包括Controller方法返回值对象进行校验。 注意方法返回值对象校验时注解放到方法前面或整个方法上面都是相同的效果。 Data public class User {NotNull(message userId不能为空)public String userId; }使用ValidatedValid校验注解 Spring Bean类上加Validated方法返回值上加Valid返回值对象中使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test13)public User test13(RequestBody User user) {return validService.test13(user);} }Validated Service public class ValidService {public Valid User test13(User user) {return user;} } 请求 curl http://127.0.0.1:8888/valid/test13 -H Content-Type: application/json -d {}结果 {code: 501,msg: userId不能为空,data: null }使用Validated校验注解 Spring Bean类上加Validated方法返回值上直接使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test14)public NotNull User test14(RequestBody User user) {return validService.test14(user);} }Validated Service public class ValidService {public NotNull User test14(User user) {return null;} }请求 curl http://127.0.0.1:8888/valid/test14 -H Content-Type: application/json -d {}结果 {code: 501,msg: 不能为null,data: null }- Spring Bean方法参数对象校验 对Spring Bean包括Controller方法参数对象进行校验。 Data public class User {NotNull(message userId不能为空)public String userId; }使用ValidatedValid校验注解 Spring Bean类上加Validated方法参数上加Valid参数对象中使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test15)public User test15(RequestBody User user) {return validService.test15(user);} }Validated Service public class ValidService {public User test15(Valid User user) {return user;} }请求 curl http://127.0.0.1:8888/valid/test15 -H Content-Type: application/json -d {}结果 {code: 501,msg: userId不能为空,data: null }使用Validated校验注解 Spring Bean类上加Validated方法参数上直接中使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test16)public User test16(RequestBody User user) {return validService.test16(null);} }Validated Service public class ValidService {public User test16(NotNull User user) {return user;} } 请求 curl http://127.0.0.1:8888/valid/test16 -H Content-Type: application/json -d {}结果 {code: 501,msg: 不能为null,data: null }分组校验 Data public class User {NotNull(message userId不能为空)public String userId;NotNull(message userName不能为空, groups {AddGroup.class})public String userName;NotNull(message age不能为空, groups {UpdateGroup.class})public String age; }- Controller方法参数分组校验 对Controller方法参数对象进行分组校验。 使用ValidatedValid校验注解 方法参数上加Validated并指定分组value属性参数对象中的字段加校验注解并指定分组groups属性。 代码 RestController RequestMapping(valid) public class ValidController {PostMapping(test17)public User test17(RequestBody Validated({AddGroup.class}) User user) {return user;}PostMapping(test18)public User test18(RequestBody Validated({UpdateGroup.class}) User user) {return user;} }请求 curl http://127.0.0.1:8888/valid/test17 -H Content-Type: application/json -d {}curl http://127.0.0.1:8888/valid/test18 -H Content-Type: application/json -d {}结果 {code: 501,msg: userName不能为空,data: null }{code: 501,msg: age不能为空,data: null }嵌套校验 Data public class User {NotNull(message userId不能为空)public String userId;Validpublic Sex sex; }Data public class Sex {NotNull(message sexName不能为空)public String sexName; }- Controller方法参数嵌套校验 对Controller方法参数对象进行嵌套校验。 使用ValidatedValid校验注解 方法参数上加Validated参数对象中的字段加Valid字段对象内再使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {PostMapping(test19)public User test19(RequestBody Validated User user) {return user;} } 请求 curl http://127.0.0.1:8888/valid/test19 -H Content-Type: application/json -d {userId: userId_a7699554a547,sex: {} }结果 {code: 501,msg: sexName不能为空,data: null }使用ValidValid校验注解 方法参数上加Valid参数对象中的字段加Valid字段对象内再使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {PostMapping(test20)public User test20(RequestBody Valid User user) {return user;} }请求 curl http://127.0.0.1:8888/valid/test20 -H Content-Type: application/json -d {userId: userId_a7699554a547,sex: {} }结果 {code: 501,msg: sexName不能为空,data: null }- Spring Bean方法返回值嵌套校验 对Spring Bean包括Controller方法返回值对象进行嵌套校验。 使用ValidatedValidValid校验注解 Spring Bean类上加Validated方法返回值上加Valid返回值对象中字段加Valid字段内使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test21)public User test21(RequestBody User user) {return validService.test21(user);} }Validated Service public class ValidService {public Valid User test21(User user) {return user;} } 请求 curl http://127.0.0.1:8888/valid/test21 -H Content-Type: application/json -d {userId: userId_a7699554a547,sex: {} }结果 {code: 501,msg: sexName不能为空,data: null }- Spring Bean方法参数嵌套校验 对Spring Bean包括Controller方法参数对象进行嵌套校验。 使用ValidatedValidValid校验注解 Spring Bean类上加Validated方法参数上加Valid参数对象中字段加Valid字段内使用校验注解。 代码 RestController RequestMapping(valid) public class ValidController {Autowiredprivate ValidService validService;PostMapping(test22)public User test22(RequestBody User user) {return validService.test22(user);} }Validated Service public class ValidService {public User test22(Valid User user) {return user;} }curl http://127.0.0.1:8888/valid/test22 -H Content-Type: application/json -d {userId: userId_a7699554a547,sex: {} }结果 {code: 501,msg: sexName不能为空,data: null }自定义注解 自定义参数校验工具的步骤 自定义注解自定义Validator 1. 自定义注解 定义一个IPV4地址的校验注解。 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME;Documented Target({ METHOD, FIELD, PARAMETER, TYPE_USE }) Retention(RUNTIME) Repeatable(Ipv4.List.class) Constraint(validatedBy {Ipv4Validator.class}) public interface Ipv4 {String message() default not is Ipv4;Class?[] groups() default {};Class? extends Payload[] payload() default {};Target({ METHOD, FIELD, PARAMETER, TYPE_USE })Retention(RUNTIME)Documentedinterface List {Ipv4[] value();} }2. 自定义Validator 定义一个校验器用于验证是否为IPV4地址。 import cn.hutool.core.lang.Validator; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext;public class Ipv4Validator implements ConstraintValidatorIpv4, String {Overridepublic void initialize(Ipv4 constraintAnnotation) {ConstraintValidator.super.initialize(constraintAnnotation);}Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 对象为空验证通过if (value null) {return true;}return Validator.isIpv4(value);} }使用示例 代码 Validated RestController RequestMapping(valid) public class ValidController {GetMapping(test23)public String test23(Ipv4(message ip不是IPV4地址) String ip) {return ip;} } 请求 curl http://127.0.0.1:8888/valid/test23?ip1.1.1结果 {code: 501,msg: ip不是IPV4地址,data: null }
http://www.huolong8.cn/news/264363/

相关文章:

  • 海报模板网站有哪些惠东seo公司
  • 创意产品设计图优化大师app下载安装
  • 合肥长丰路网站建设那个视频网站最好最全网址
  • 公司申请网站建设申请理由网站建设私活中能找
  • 南京做网站哪家好广告网站建设制作设计服务商
  • intitle:律师网站建设的重要性wordpress attitude
  • 微信网站建设开发苏州网站建设排名
  • 建筑品牌网站直播网站建设项目策划书
  • 青浦专业做网站公司专科计算机哪个专业最吃香
  • 网页设计网站简单静态模板企业核名查询系统是哪个
  • 怎样把自己的网站上传网站说建设中
  • 360网站建设搜索网站开发入股合作分配比例
  • 商赢网站建设wordpress 下拉框图标
  • 杭州做网站外包公司网站正在建设中 色
  • 如何建立国际网站巩义网站建设工程
  • 网站建设三网合一指的是什么物流网站怎么开
  • 微信官方网站开发免费素材下载网站有哪些
  • 做seo网站优化价格晚上必看的正能量视频下载
  • 驾校一点通网站怎么做网站建设费用申请
  • 网站seo优化网站在dw上做网站首页导航栏
  • 漳州建设网站云南专业网站建设
  • 帮彩票网站做流量提升成都网站建设外贸
  • 石家庄网络建站网站排名张家港
  • 网页建站网站本地网站开发
  • 广州建设网站公司简介上市公司网站建设分析
  • 做网站 网络映射建站推广什么意思
  • 制作网站培训学校哈尔滨优化调整人员流动管理
  • 河间做网站 申梦网络网站空间关闭了怎么办
  • 自己做网站要多少钱做网站公司-汉狮网络
  • 4a网站建设公司网站开发的英文文献