springboot 异常处理(输入参数验证,加上分组 第二版)

目的:在一个表中,添加或更新不同的字段(一个表中多次插入,要分组进行判断)


一、定义分组接口

    public interface First {  
    }  
      
    public interface Second {  
    }  

即通过@Validate注解标识要验证的分组;如果要验证两个的话,可以这样@Validated({First.class, Second.class})。

通过@GroupSequence指定验证顺序:先验证First分组,如果有错误立即返回而不会验证Second分组,接着如果First分组验证通过了,那么才去验证Second分组,最后指定xx.class表示那些没有分组的在最后

@GroupSequence只能运用在Type(也就是类)下。其中,Default.class不能出现在GroupSequence列表中,且对应类的Object.class是GroupSequence列表中的一部分,一般放在最后。

1.demo1

bean代码

@GroupSequence({First.class, Second.class, BPCountLimit.class})
public class xx implements Serializable{
 
    @NotNull(message = "{user.id.null}",groups = {Second.class})
    private String cityareaid;
   @NotNull(message = "{user.name.length.illegal}",groups = {Second.class})
    private String cityid;

    @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {First.class})
    private String shoptypename;

    @NotNull(message = "{user.id.null}",groups = {First.class})
    @Min(value = 20, message = "{user.name.length.illegal}",groups = { Second.class})

controller层代码

 @PostMapping("demo1")
    public ResultVO insertBPCountLimit(@Valid @RequestBody CountLimit CountLimit){

        Service.insert(CountLimit);

        return ResultVOUtil.success("success");
    }

结果

{
  "code": 2,
  "msg": "[month1:{user.id.null}]",
  "data": null
}
解析:@Valid所有分组都验证  ,根据@GroupSequence先验证First分组,如果有错误立即返回而不会验证Second分组

demo2

bean代码

@GroupSequence({First.class, Second.class, BPCountLimit.class})
public class xx implements Serializable{
 
    @NotNull(message = "{user.id.null}") //这个地方发生改变
    private String cityareaid;
   @NotNull(message = "{user.name.length.illegal}",groups = {Second.class})
    private String cityid;

    @Pattern(regexp = "[a-zA-Z]{5,20}", message = "{user.name.illegal}", groups = {First.class})
    private String shoptypename;

    @NotNull(message = "{user.id.null}",groups = {First.class})
    @Min(value = 20, message = "{user.name.length.illegal}",groups = { Second.class})

controller层代码

 @PostMapping("demo1")
    public ResultVO insertBPCountLimit(@Validated({First.class}) @RequestBody  xxx   CountLimit){

        Service.insert(CountLimit);  

        return ResultVOUtil.success("success");
    }

结果

 
 
{
  "code": 2,
  "msg": "[month1:{user.id.null}]",
  "data": null
}
解析:@Validated({First.class}) @RequestBody  ,只验证First分组  没有分组信息的也不校验

demo3

bean和demo2是一样的

controller层代码

 @PostMapping("demo1")
    public ResultVO insertBPCountLimit(@Validated({Second.class,First.class}) @RequestBody  xxx   CountLimit){

        Service.insert(CountLimit);  

        return ResultVOUtil.success("success");
    }

结果

 
 
{
  "code": 2,
  "msg": "[cityid:用户名长度必须在5到20之间  , month1:用户编号不能为空  ]",
  "data": null
}

解析: (@Validated({Second.class,First.class}) 验证First分组和Second分组  没有分组信息的也不校验

二、Resource 下新建错误信息配置文件


注意:名字必须为“ValidationMessages.properties“ 因为SpringBoot自动读取classpath中的ValidationMessages.properties里的错误信息


user.id.null=用户编号不能为空  
user.name.null=用户名不能为空  
user.name.length.illegal=用户名长度必须在5到20之间  

三、异常处理(参考博客第一版)

当验证不通过时会抛异常出来,异常的message 就是 ValidationMessages.properties 中配置的提示信息。此处定义异常处理器。捕获异常信息(因为验证不通过的项可能是多个所以统一捕获处理),并抛给前端。(此处是前后端分离开发)

四、附录

限制 说明
@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格式


猜你喜欢

转载自blog.csdn.net/fwk19840301/article/details/80360917