代理网站备案表,wordpress去广告,全球十大建筑设计公司,苏州建设网站的网络公司validation-数据校验
前端可以通过day.js、elemetui的表单验证rules等 进行校验。
为什么使用#xff1a; Validation是一套帮助我们继续对传输的参数进行数据校验的注解#xff0c;通过配置Validation可以轻松优雅的完成对数据的约束检验。
添加注解
!-- val…validation-数据校验
前端可以通过day.js、elemetui的表单验证rules等 进行校验。
为什么使用 Validation是一套帮助我们继续对传输的参数进行数据校验的注解通过配置Validation可以轻松优雅的完成对数据的约束检验。
添加注解
!-- validation数据校验--dependencygroupIdjavax.validation/groupIdartifactIdvalidation-api/artifactIdversion2.0.1.Final/version/dependency!--springboot 高版本默认以及成validation添加下面依赖属性验证--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependency
常用注解
AssertTrue用于 boolean 字段该字段只能为 trueAssertFalse用于 boolean 字段该字段只能为 falseDecimalMax用于 Number 字段只能小于或等于该值DecimalMin用于 Number 字段只能大于或等于该值Digits(integer2,fraction20)检查是否是数字校验整数位及小数位Future检查该字段的日期是否是属于将来的日期Past验证日期是否在当前时间之前否则无法通过校验Length(min2,max6)用于字符串检查字段长度是否在指定范围内Max用于 Number 字段只能小于或等于该值Min用于 Number 字段只能大于或等于该值NotNull该字段不能为空NotEmpty用于字符串该字段不能为空字符串NotBlank用于字符串该字段不能为空字符串忽略空格Null该字段必须为空Size(min2,max4)用于字符串、数组、集合、Map等检查该字段的size是否在指定范围Digits(integer 2, fraction 2)验证数字的整数位和小数位的位数是否超过指定的长度Pattern(regexp “[abc]”)用于验证字段是否与给定的正则相匹配Range(min, max)区间校验Email验证是否是邮件地址如果为null,不进行验证算通过验证。
使用方法
步骤1使用校验注解
在Java中提供了一系列的校验方式它这些校验方式在“javax.validation.constraints”包中提供了如EmailNotNullNotBlank等注解。
自定义错误消息可以覆盖默认的错误提示信息.更改注解的message值
public class BrandEntity implements Serializable {private static final long serialVersionUID 1L;/*** 品牌id*/TableIdprivate Long brandId;/*** 品牌名*/NotBlank(message 品牌名必须提交)private String name;
}
步骤2在请求方法种使用校验注解Valid开启校验 RequestMapping(/save)public R save(Valid RequestBody BrandEntity brand){brandService.save(brand);return R.ok();}能够看到defaultMessage: “不能为空”这些错误消息定义在“hibernate-validator”的“\org\hibernate\validator\ValidationMessages_zh_CN.properties”文件中。在该文件中定义了很多的错误规则 javax.validation.constraints.AssertFalse.message 只能为false
javax.validation.constraints.AssertTrue.message 只能为true
javax.validation.constraints.DecimalMax.message 必须小于或等于{value}
javax.validation.constraints.DecimalMin.message 必须大于或等于{value}
javax.validation.constraints.Digits.message 数字的值超出了允许范围(只允许在{integer}位整数和{fraction}位小数范围内)
javax.validation.constraints.Email.message 不是一个合法的电子邮件地址
javax.validation.constraints.Future.message 需要是一个将来的时间
javax.validation.constraints.FutureOrPresent.message 需要是一个将来或现在的时间
javax.validation.constraints.Max.message 最大不能超过{value}
javax.validation.constraints.Min.message 最小不能小于{value}
javax.validation.constraints.Negative.message 必须是负数
javax.validation.constraints.NegativeOrZero.message 必须是负数或零
javax.validation.constraints.NotBlank.message 不能为空
javax.validation.constraints.NotEmpty.message 不能为空
javax.validation.constraints.NotNull.message 不能为null
javax.validation.constraints.Null.message 必须为null
javax.validation.constraints.Past.message 需要是一个过去的时间
javax.validation.constraints.PastOrPresent.message 需要是一个过去或现在的时间
javax.validation.constraints.Pattern.message 需要匹配正则表达式{regexp}
javax.validation.constraints.Positive.message 必须是正数
javax.validation.constraints.PositiveOrZero.message 必须是正数或零
javax.validation.constraints.Size.message 个数必须在{min}和{max}之间org.hibernate.validator.constraints.CreditCardNumber.message 不合法的信用卡号码
org.hibernate.validator.constraints.Currency.message 不合法的货币 (必须是{value}其中之一)
org.hibernate.validator.constraints.EAN.message 不合法的{type}条形码
org.hibernate.validator.constraints.Email.message 不是一个合法的电子邮件地址
org.hibernate.validator.constraints.Length.message 长度需要在{min}和{max}之间
org.hibernate.validator.constraints.CodePointLength.message 长度需要在{min}和{max}之间
org.hibernate.validator.constraints.LuhnCheck.message ${validatedValue}的校验码不合法, Luhn模10校验和不匹配
org.hibernate.validator.constraints.Mod10Check.message ${validatedValue}的校验码不合法, 模10校验和不匹配
org.hibernate.validator.constraints.Mod11Check.message ${validatedValue}的校验码不合法, 模11校验和不匹配
org.hibernate.validator.constraints.ModCheck.message ${validatedValue}的校验码不合法, ${modType}校验和不匹配
org.hibernate.validator.constraints.NotBlank.message 不能为空
org.hibernate.validator.constraints.NotEmpty.message 不能为空
org.hibernate.validator.constraints.ParametersScriptAssert.message 执行脚本表达式{script}没有返回期望结果
org.hibernate.validator.constraints.Range.message 需要在{min}和{max}之间
org.hibernate.validator.constraints.SafeHtml.message 可能有不安全的HTML内容
org.hibernate.validator.constraints.ScriptAssert.message 执行脚本表达式{script}没有返回期望结果
org.hibernate.validator.constraints.URL.message 需要是一个合法的URLorg.hibernate.validator.constraints.time.DurationMax.message 必须小于${inclusive true ? 或等于 : }${days 0 ? : days 天}${hours 0 ? : hours 小时}${minutes 0 ? : minutes 分钟}${seconds 0 ? : seconds 秒}${millis 0 ? : millis 毫秒}${nanos 0 ? : nanos 纳秒}
org.hibernate.validator.constraints.time.DurationMin.message 必须大于${inclusive true ? 或等于 : }${days 0 ? : days 天}${hours 0 ? : hours 小时}${minutes 0 ? : minutes 分钟}${seconds 0 ? : seconds 秒}${millis 0 ? : millis 毫秒}${nanos 0 ? : nanos 纳秒}
步骤3给校验的Bean后紧跟一个BindResult就可以获取到校验的结果。拿到校验的结果就可以自定义的封装。 RequestMapping(/save)public R save(Valid RequestBody BrandEntity brand, BindingResult result){if( result.hasErrors()){MapString,String mapnew HashMap();//1.获取错误的校验结果result.getFieldErrors().forEach((item)-{//获取发生错误时的messageString message item.getDefaultMessage();//获取发生错误的字段String field item.getField();map.put(field,message);});return R.error(400,提交的数据不合法).put(data,map);}brandService.save(brand);return R.ok();}这种是针对于该请求设置了一个内容校验如果针对于每个请求都单独进行配置显然不是太合适实际上可以统一的对于异常进行处理。
步骤4统一异常处理
可以使用SpringMvc所提供的ControllerAdvice通过“basePackages”能够说明处理哪些路径下的异常。
1抽取一个异常处理类
package com.df.gulimall.product.exception;import com.df.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;/*** 集中处理所有异常*/
Slf4j
RestControllerAdvice(basePackages com.df.gulimall.product.controller)
public class GulimallExceptionAdvice {//数据校验异常 sExceptionHandler(value Exception.class)public R handleValidException(MethodArgumentNotValidException exception) {MapString, String map new HashMap();BindingResult bindingResult exception.getBindingResult();bindingResult.getFieldErrors().forEach(fieldError - {String message fieldError.getDefaultMessage();String field fieldError.getField();map.put(field, message);});log.error(数据校验出现问题{},异常类型{}, exception.getMessage(), exception.getClass());return R.error(BizCodeEnume.VALID_EXCEPTION.getCode(), BizCodeEnume.VALID_EXCEPTION.getMsg()).put(data, map);}//其他异常处理ExceptionHandler(value Throwable.class)public R handleException(Throwable throwable) {return R.error(BizCodeEnume.UNKNOW_EXEPTION.getCode(), BizCodeEnume.UNKNOW_EXEPTION.getMsg());}
}
2测试 http://localhost:88/api/product/brand/save 3默认异常处理 ExceptionHandler(value Throwable.class)public R handleException(Throwable throwable){log.error(未知异常{},异常类型{},throwable.getMessage(),throwable.getClass());return R.error(BizCodeEnum.UNKNOW_EXEPTION.getCode(),BizCodeEnum.UNKNOW_EXEPTION.getMsg());}4错误状态码
上面代码中针对于错误状态码是我们进行随意定义的然而正规开发过程中错误状态码有着严格的定义规则如该在项目中我们的错误状态码定义 为了定义这些错误状态码我们可以单独定义一个常量类用来存储这些错误状态码
package com.bigdata.common.exception;/**** 错误码和错误信息定义类* 1. 错误码定义规则为5为数字* 2. 前两位表示业务场景最后三位表示错误码。例如100001。10:通用 001:系统未知异常* 3. 维护错误码后需要维护错误描述将他们定义为枚举形式* 错误码列表* 10: 通用* 001参数格式校验* 11: 商品* 12: 订单* 13: 购物车* 14: 物流*/
public enum BizCodeEnum {UNKNOW_EXEPTION(10000,系统未知异常),VALID_EXCEPTION( 10001,参数格式校验失败);private int code;private String msg;BizCodeEnum(int code, String msg) {this.code code;this.msg msg;}public int getCode() {return code;}public String getMsg() {return msg;}
}
5测试 http://localhost:88/api/product/brand/save