jsr-303参数校验统一异常处理

为什么要使用jsr-303?

先看最基础验证前端参数是否符合要求代码

public Result<String> add(@RequestBody User user){
        if(user != null){
            return Result.failed(-1,"用户不存在");
        }
        if(StringUtils.isNotBlank(user.getUserName())){
            return Result.failed(-1,"用户不存在");
        }
        System.out.println(user);
        return Result.success("成功");
}

可以看到这种验证方式很麻烦,也很不优雅,那么jsr-303可以让我们更加专注逻辑代码,不用写这种参数的校验

springboot整合jsr-303分组验证

pom.xml

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.18.Final</version>
</dependency>

分组

/**
 * JR303新增校验分组
 */
public interface AddGroup {
}
/**
 * JR303修改校验分组
 */
public interface UpdateGroup {
}

实体类User.java

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @NotNull(message = "id不能为空",groups = {UpdateGroup.class})
    private Long userId;
    @NotBlank(message = "名称不能为口",groups = {AddGroup.class, UpdateGroup.class})
    private String userName;
    @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号格式错误",groups = {AddGroup.class,UpdateGroup.class})
    @NotBlank(message = "手机号码不能为空",groups = {AddGroup.class, UpdateGroup.class})
    private String phone;
    @Range(min = 1,max = 150,message = "年龄应该1-150岁之间",groups = {AddGroup.class, UpdateGroup.class})
    private Integer age;
    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", phone='" + phone + '\'' +
                ", age=" + age +
                '}';
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

注解详细信息

在这里插入图片描述

控制层DemoController.java

@RestController
public class DemoController {
    /**
     *  加入@Validated注解生效,AddGroup.class代表只对User类中加入groups = {UpdateGroup.class}属性才验证
     * @param user
     * @return
     */
    @PostMapping("/add")
    public Result<String> add(@Validated(AddGroup.class) @RequestBody User user){
        System.out.println(user);
        return Result.success("成功");
    }

    @PostMapping("update")
    public void update(@Validated(UpdateGroup.class) @RequestBody User user){
        System.out.println(user);
    }
}

jsr-303异常统一处理(验证参数是否符合要求)

/**
 * jsr303异常统一处理
 * @author wxd 
 * @create 2022-11-07 13:23
 */
@Slf4j
//扫描地址
@RestControllerAdvice(basePackages = "com.example.demo.controller")
public class ExceptionControllerAdvice {
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handleVaildException(MethodArgumentNotValidException e){
        log.error("数据校验出现问题:{},异常类型:{}",e.getMessage(),e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        StringBuffer stringBuffer = new StringBuffer();
        bindingResult.getFieldErrors().forEach(item ->{
            //获取错误信息
            String message = item.getDefaultMessage();
            //获取错误的属性名字
            String field = item.getField();
            stringBuffer.append(field + ":" + message + " ");
        });
        return Result.failed(400, stringBuffer + "");

    }

    @ExceptionHandler(value = Throwable.class)
    public Result handleException(Throwable throwable){
        log.error("错误",throwable);
        return Result.failed(400, "系统异常");
    }
}

验证

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码地址

https://github.com/wuxuedong/jsr-303

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值