@Validated注解校验

最近新项目是使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值