基于SpringBoot,@validated注解,全局异常处理的自动参数校验

676 阅读1分钟

基于SpringBoot,@validated注解,全局异常处理的自动参数校验

引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.2.6.RELEASE</version>
</dependency>

在实体类上添加校验注解:

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Date;

public class User {

    @NotNull(message = "用户Id不能为空")
    private Long userId;

    @NotBlank(message = "用户名不能为空")
    private String username;

    @NotBlank(message = "密码不能为空")
    private String password;

    @NotNull(message = "登陆日期不能为空")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date loginDate;

    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 String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getLoginDate() {
        return loginDate;
    }

    public void setLoginDate(Date loginDate) {
        this.loginDate = loginDate;
    }
}

定义全局异常处理: 当检验不通过时会自动抛出MethodArgumentNotValidException异常,捕获该异常,拿到我们在注解处自定义的提示信息,返回封装的结果。 注意:此处如果要返回JSON格式字符串别忘记在方法上加上@ResponseBody注解或者使用@RestControllerAdvice注解,否则返回的结果会被识别成视图路径导致404。

@RestControllerAdvice
public class ValidatedExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map validExceptionHandler(MethodArgumentNotValidException e){
        HashMap<String, Object> result = new HashMap<>();
        result.put("success",false);
        result.put("code","9999");
        result.put("message",e.getBindingResult().getFieldError().getDefaultMessage());
        return result;
    }
}

定义接口,记得在入参处加上@Validated注解,开启参数校验:

import com.springboot.entity.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class HelloController {

    @PostMapping("/update")
    public Map update(@RequestBody @Validated User user){
        HashMap<Object, Object> result = new HashMap<>();
        result.put("success",true);
        result.put("code","10000");
        result.put("message","更新成功");
        return result;
    }

}

最终结果演示: 入参:

image.png 返回结果: image.png 除了这种简单的使用方法外,我们也可以通过在注解中添加group属性来对校验进行分组,从而达到不同的接口校验不同的属性集。比如新增接口不校验userId,但是更新接口校验userId,具体可以自行百度,这里不细说。

这种自动参数校验机制可以帮助我们有效减少入参的if条件判断,精简代码