springboot项目使用Validated对前端传递数据校验并处理异常与分组

一、 本文内容
使用Validated对前端传递参数进行校验,并且处理校验失败时的异常,同时对校验对象进行分组,解决了对于前端传递的数据需要进行验证的问题。以往需要写大量的if-else语句,这次直接使用注解解决。
二、 步骤
1.添加maven包(springboot项目大多数已经存在这个包)

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

2.Pojo类添加注解
@NotNull 验证参数不能为空(还有很多其他注解验证手机号,邮箱之类的)

@Data
public class User {

    @NotNull(message = "username不能为空")
    private String username;

    @NotNull(message = "password不能为空")
    private String password;
}

3.Controller添加注解

@Controller
@Validated
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    //登录
    @RequestMapping("/login")
    @ResponseBody
    public ServerResponse login(@Validated User user){
        return userService.login(user.getUsername(),password);
    }

4.效果图
当前端传递的参数为空是会直接报异常。
在这里插入图片描述
在这里插入图片描述
但这样的异常的处理对前端不够友好,我们要把异常作为json形式传回去。
类似于这个样子
在这里插入图片描述
5.添加一个异常处理类

@ControllerAdvice
@ResponseBody
public class GlobleExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public ServerResponse exceptionHandler(HttpServletRequest request
    ,Exception e){
        if(e instanceof BindException){
            BindException ex =(BindException)e;
            List<ObjectError> errors =ex.getAllErrors();
            ObjectError error=errors.get(0);
            String msg = error.getDefaultMessage();
            return ServerResponse.createByErrorCodeMessage(ResponseCode.ERROR_MISSPARAM.getCode(),ResponseCode.ERROR_MISSPARAM.getDesc()+msg);
        }else {
            return ServerResponse.createByError();
        }
    }
}

代码解读
1.@ControllerAdvice
注解将作用在所有注解了@RequestMapping的控制器的方法上。

2.@ExceptionHandler(value = Exception.class)
注解将获取全部的异常

3.ServerResponse为我自定义的一个返回对象,改为String即可

4.if(e instanceof BindException)
判断e的类型是否是BindException

异常处理完后我们发现虽然对前端页面友好,但是前端会调用不同的接口,如果其它接口不需要判断这两个是否为空,而需要另外的值不为空,这怎么办?这需要对pojo对象进行分组。

6.修改pojo代码

@Data
public class User {

    @NotBlank(groups = {AuthCodeLoginGroup.class,LoginGroup.class},message = "username不能为空")
    private String username;

    @NotNull(groups = {LoginGroup.class},message = "password不能为空")
    private String password;

    @NotNull(groups = {AuthCodeLoginGroup.class},message = "authcode不能为空")
    private String authcode;

    //验证码登录
    public interface AuthCodeLoginGroup {}

    //正常登录
    public interface LoginGroup{}
}

这里有两种登录方式
第一种登录方式是账户密码登录所以需要的参数为username与password
第二种登录方式是验证码登录所以需要的参数为username与authcode
所以创建了两个接口,每个接口是一个组。
7.修改Controller代码

public class UserController {
    @Autowired
    private UserService userService;

    //登录
    @RequestMapping("/login")
    @ResponseBody
    public ServerResponse login(@Validated({User.LoginGroup.class}) User user){    
        return userService.login(user.getUsername(),password);
    }

    //验证码登录
    @RequestMapping("/authcode_login")
    @ResponseBody
    public ServerResponse authcode_login(@Validated({User.AuthCodeLoginGroup.class}) User user){

        return userService.login_authcode(user.getUsername(),user.getAuthcode());
    }
}

这里调用不同的组就可以验证pojo里的不同参数,而不是全部校验

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值