springboot表单验证
@Valid
用处:对前端传过来的参数进行验证,若不符合规范,可以禁止后续操作,且显示规范中的异常信息。
@Valid 的主要作用是用于数据效验,可以在定义的实体中的属性上,添加不同的注解来完成不同的校验规则
区别:
分组:无分组功能
可注解位置:可以用在方法、构造函数、方法参数和成员属性上(两者是否能用于成员属性上直接影响能否提供嵌套验证的功能)
嵌套验证:用在方法入参上无法单独提供嵌套验证功能;能够用在成员属性上,提示验证框架进行嵌套验证;能配合嵌套验证注解@Valid进行嵌套验证。
实现逻辑:
代码实现(三种情况):
实体类上加验证;
1:
public class User{
@NotBlank(message = "姓名不能为空")
private String name;
@NotBlank(message = "密码不能为空")
private String password;
}
2:若实体类嵌套另一个实体类时要加@Valid
public class User{
@NotBlank(message = "姓名不能为空")
private String name;
@Valid
@NotNull(message = "用户信息不能为空")
private UserInfo userInfo;
}
public class UserInfo{
@NotBlank(message = "年龄不能为空")
@Max(value = 18, message = "不能超过18岁")
private String age;
@NotBlank(message = "性别不能为空")
private String gender;
}
接口上加验证:
在 Controller 类中添加接口,POST 方法中接收设置了 @Valid 相关注解的实体对象,然后在参数中添加 @Valid 注解来开启效验功能,需要注意的是, @Valid 对 Get 请求中接收的平面参数请求无效,稍微略显遗憾。
@RestController
public class TestController{
@PostMapping("/user")
public String addUserInfo(@Valid @RequestBody User user){
return "成功";
}
}
异常类上加验证:
写一个全局异常处理类,然后对接口中抛出的异常进行处理,而 @Valid 配合 Spring 会抛出 MethodArgumentNotValidException 异常,这里我们需要对该异常进行处理即可
@RestControllerAdvice("com.hhz.valid") //指定异常处理包名
public class GlobalExceptionHandler{
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler({MethodArgumentNotValidException.class})
public String paramExceptionHandler(MethodArgumentNotValidException e){
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if(exceptions.hasErrors()){
List<ObjectError> errors = exceptions.getAllErrors();
if(!errors.isEmpty()){
FieldError fieldError = (FieldError)errors.get(0);
return fieldError.getDefaultMessage();
}
}
return "请求参数有误";
}
}
常用的注解:
@Null
@NotBlank(message=“不能为空哦”)
@Min(value=18,message=“不能小于18岁啊”)
@Validated
区别:
分组:提供分组功能,可在入参验证时,根据不同的分组采用不同的验证机制。
可注解位置 :可以用在类型、方法和方法参数上。但是不能用在成员属性上
嵌套验证:用在方法入参上无法单独提供嵌套验证功能;不能用在成员属性上;也无法提供框架进行嵌套验证;能配合嵌套验证注解 @Valid 进行嵌套验证。
代码实现(主要区别是分组方式):
@Entity
public class User{
@NotNull(group=Update.class,message="不能为空")
@Null(group=Add.class)
private String userId;
private String name;
}
@RestController("/user")
public class UserController{
@Autowired
private UserService userSerivce;
@PutMapping
//@Validated(value={User.Update.class})该接口使用update的校验方式
public String updateUser(@Validated(value={User.Update.class}) @RequestBody User user){
int res = userService.updateUser(user);
return res == 1 ? "成功" : "失败";
}
@PostMapping
public String addUser(@Validated(value={User.Add.class}) @RequestBody User user){
int res = userService.insertUser(user);
return res == 1 ? "成功" : "失败";
}
}