基于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;
}
}
最终结果演示: 入参:
返回结果:
除了这种简单的使用方法外,我们也可以通过在注解中添加group属性来对校验进行分组,从而达到不同的接口校验不同的属性集。比如新增接口不校验userId,但是更新接口校验userId,具体可以自行百度,这里不细说。
这种自动参数校验机制可以帮助我们有效减少入参的if条件判断,精简代码