首先先获取Valiation对象:
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 1. 全属性校验 /** * 验证某个对象所有字段 * * @param obj * @param <T> * @return */ public static <T> ValidationResult validateEntity(T obj) { ValidationResult result = new ValidationResult(); Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class); if (!CollectionUtils.isEmpty(set)) { result.setHasErrors(true); Map<String, String> errorMsg = new HashMap<>(); for (ConstraintViolation<T> cv : set) { errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage()); } result.setErrorMsg(errorMsg); } return result; } 2.某个字段的单独校验 /** * 验证某个对象某个字段 * * @param obj * @param propertyName * @param <T> * @return */ public static <T> ValidationResult validateProperty(T obj, String propertyName) { ValidationResult result = new ValidationResult(); Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class); if (!CollectionUtils.isEmpty(set)) { result.setHasErrors(true); Map<String, String> errorMsg = new HashMap<>(); for (ConstraintViolation<T> cv : set) { errorMsg.put(propertyName, cv.getMessage()); } result.setErrorMsg(errorMsg); } return result; }ValidationResult的定义如下:
@Data @Builder @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class ValidationResult { private Boolean hasErrors; private Map<String, String> errorMsg; } 七、文件上传校验 1.tomcat容器下文件上传校验在springboot+tomcat架构下的文件上传校验,假如已经有了如下的配置:
spring: servlet: multipart: max-file-size: 1MB max-request-size: 1MB这表示只允许上传小于1MB大小的文件,如果不指定异常处理器,默认会报前端400,在ValidationAdvice类中添加如下代码可以自定义返回结果:
//文件上传文件大小超出限制 @ExceptionHandler(MaxUploadSizeExceededException.class) @ResponseBody public WrapperResult<Map<String,Object>> fileSizeException(MaxUploadSizeExceededException exception) { log.error("文件太大,上传失败",exception); return WrapperResult.faild("只允许上传不大于"+exception.getMaxUploadSize()+"的文件"); } 2.其它容器在Jetty容器中1中的方法可能会失效,未验证;在undertow容器中是一定会失效,已经验证。undertow容器毕竟和spring-boot没有完全打磨好,不建议现阶段使用。
八、附录 1.所有校验规则注解说明 注解 说明@Null 被注解的元素必须为空
@NotNull 被注解的元素必须不为空
@AssertTrue 被注解的元素必须为true
@AssertFlase 被注解的元素必须为false
@Min(value) 被注解的元素必须是数字,且必须大于指定的最小值
@Max(value) 被注解的元素必须是数字,且必须小于指定的最大值
@DecimalMin(value) 被注解的元素必须是数字,且必须大于指定的最小值
@DecaimalMax(value) 被注解的元素必须是数字,且必须小于指定的最大值
@Size(max=,min=) 被注解元素的大小必须在指定的范围内
@Digit(integer,fraction) 被注解元素必须是数字,且其值必须在可接受的范围内
@Past 被注解元素必须是一个过去的日期
@Futrue 被注解元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注解元素必须符合指定的正则表达式
@NotBlank 验证非空,且长度必须大于0
@Email 被注解的元素必须是电子邮件地址
@Length(max=,min=) 被注解的字符串大小必须在指定的范围内
@NotEmpty 被注解的字符串必须非空
@Range(max=,min=) 被注解的元素必须在指定范围内
2.校验规则注解例子 // 空和非空检查: @Null、@NotNull、@NotBlank、@NotEmpty @Null(message = "验证是否为 null") private Integer isNull; @NotNull(message = "验证是否不为 null, 但无法查检长度为0的空字符串") private Integer id; @NotBlank(message = "检查字符串是不是为 null,以及去除空格后长度是否大于0") private String name; @NotEmpty(message = "检查是否为 NULL 或者是 EMPTY") private List<String> stringList; // Boolean值检查: @AssertTrue、@AssertFalse @AssertTrue(message = " 验证 Boolean参数是否为 true") private Boolean isTrue; @AssertFalse(message = "验证 Boolean 参数是否为 false ") private Boolean isFalse; // 长度检查: @Size、@Length @Size(min = 1, max = 2, message = "验证(Array,Collection,Map,String)长度是否在给定范围内") private List<Integer> integerList; @Length(min = 8, max = 30, message = "验证字符串长度是否在给定范围内") private String address; // 日期检查: @Future、@FutureOrPresent、@Past、@PastOrPresent @Future(message = "验证日期是否在当前时间之后") private Date futureDate; @FutureOrPresent(message = "验证日期是否为当前时间或之后") private Date futureOrPresentDate; @Past(message = "验证日期是否在当前时间之前") private Date pastDate; @PastOrPresent(message = "验证日期是否为当前时间或之前") private Date pastOrPresentDate; // 其它检查: @Email、@CreditCardNumber、@URL、@Pattern、 @ScriptAssert、@UniqueElements @Email(message = "校验是否为正确的邮箱格式") private String email; @CreditCardNumber(message = "校验是否为正确的信用卡号") private String creditCardNumber; @URL(protocol = "http", host = "127.0.0.1", port = 8080, message= "校验是否为正确的URL地址") private String url; @Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "正则校验是否为正确的手机号") private String phone; // 对关联对象元素进行递归校验检查 @Valid @UniqueElements(message = "校验集合中的元素是否唯一") private List<CalendarEvent> calendarEvent; @Data @ScriptAssert(lang = "javascript", script ="_this.startDate.before(_this.endDate)",message = "通过脚本表达式校验参数") private class CalendarEvent { private Date startDate; private Date endDate; } // 数值检查: @Min、@Max、@Range、@DecimalMin、@DecimalMax、@Digits @Min(value = 0, message = "验证数值是否大于等于指定值") @Max(value = 100, message = "验证数值是否小于等于指定值") @Range(min = 0, max = 100, message = "验证数值是否在指定值区间范围内") private Integer score; @DecimalMin(value = "10.01", inclusive = false, message = "验证数值是否大于等于指定值") @DecimalMax(value = "199.99", message = "验证数值是否小于等于指定值") @Digits(integer = 3, fraction = 2, message = "限制整数位最多为3,小数位最多为2") private BigDecimal money; 九、源代码地址
https://gitee.com/kdyzm/validation-spring-boot-demo
我的博客地址:https://blog.kdyzm.cn 欢迎留言指教~