最近新项目是使用Hibernate Validator做表单验证,遇到有id在更新时不能为空,而在添加时需要为空的情况,所有使用了group属性来指定在什么情况下使用哪个验证规则,而在Controller方法只使用@Validated({Creation.class})来分组验证:
public ApiResponse<UserDTO> createUser(@Validated({Creation.class}) @RequestBody UserDTO userDTO) {
log.debug("创建用户 : {}", userDTO);
if (userRepository.findOneByLoginName(userDTO.getLoginName().toLowerCase()).isPresent()) {
return ApiResponse.ofFailure("用户名已存在");
} else {
UserDTO newUser = userService.createUser(userDTO);
return ApiResponse.ofSuccess(newUser);
}
}
但是出现其他字段不执行验证的问题,找了一大圈,发现@Validated在分组验证时并没有添加Default.class的分组,而其他字段默认都是Default分组,所以需要让分组接口继承Default:
public interface Creation extends Default {
————————————————
版权声明:本文为CSDN博主「keyliwen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/keyliwen/article/details/80702633
@Valid是使用hibernate validation的时候使用;而@Validated 是只用spring Validator 校验机制使用。
下面介绍@Validated注解校验的使用
一、添加校验信息
在需要校验的对象上添加校验类别及错误提示信息即可
public class ChecktemplateSupport {
private String id;
@NotBlank(message = "检查模板名称不能为空")
private String strname;
@NotNull(message = "检查模板类型不能为空")
private Integer checktype;
private Integer nenabled;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
private Date dtcreatetime;
private Integer strcreateauthor;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
private Date dtupdatetime;
private Integer strupdateauthor;
private Integer tempversion;
private Integer nstatus;
private Integer userid;
@Valid
private List<ChecktemplateProjectSupport> project;
}
常见的校验类别注解见下表:
限制 说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
二、接口中引入校验、绑定BindingResult
public CommonResponse<Checktemplate> addCheckTemplate(@Validated @RequestBody ChecktemplateSupport checktemplateSupport, BindingResult bindingResult,HttpSession httpSession) {
......
}
三、处理校验结果
public static String handleBindException(BindingResult ex){
// ex.getFieldError():随机返回一个对象属性的异常信息。如果要一次性返回所有对象属性异常信息,则调用ex.getAllErrors()
List<ObjectError> errors = ex.getAllErrors();
if(errors != null && errors.size() > 0){
StringBuilder sb = new StringBuilder();
for (ObjectError err : errors) {
sb.append(err.getDefaultMessage()).append("; ");
}
return sb.toString();
}
return null;
}
四、问题及解决
(1)对象中的对象需要校验,添加@Validated,仍旧无法校验
目前不知道原因,只知道解决方案,有知道的大神求回复。解决方案,将@Validated替换成@Valid就可以了
(2)Integer类型定义成NotEmpty报错
原因:@NotEmpty一般适用于集合类、String、Array的校验;@NotNull可适用于任意对象。
Integer使用@NotNull校验就行
(3)String类型字段,null能捕获校验,但“”空字符串未捕获校验
被自己蠢哭。原因:使用了@NotEmpty只校验了null,使用@NotBlank即可
————————————————
版权声明:本文为CSDN博主「码上浪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_27992659/article/details/80865687