参考资源
基本使用
导包
//Spring只是定义接口没有实现,需要使用Hibernate 实现
implementation 'org.springframework.boot:spring-boot-starter-validation'
使用
public class UserParam {
@NotEmpty(message = "username不能为空")
private String username;
@NotEmpty(message = "密码不能为空")
private String pwd;
}
controller
@PostMapping("/test2")
public String test2(@Valid UserParam userParam) {
System.err.println(userParam);
return "test";
}
分组校验
定义分组
package co.sekisuihouse.apServer.validated;
public interface UserAddGroup {
}
package co.sekisuihouse.apServer.validated;
public interface UserUpdateGroup {
}
使用
public class UserParam {
@NotEmpty(message = "id不能为空", groups = { UserUpdateGroup.class })
private String id;
@NotEmpty(message = "username不能为空", groups = { UserAddGroup.class,UserUpdateGroup.class })
private String username;
@NotEmpty(message = "密码不能为空", groups = { UserUpdateGroup.class,UserAddGroup.class })
private String pwd;
}
controller
package co.sekisuihouse.apServer.controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import co.sekisuihouse.apServer.pojo.request.UserParam;
import co.sekisuihouse.apServer.validated.UserAddGroup;
import co.sekisuihouse.apServer.validated.UserUpdateGroup;
@RestController
public class TestController {
@PostMapping("/test")
public String test(@Validated(UserAddGroup.class) UserParam userParam) {
System.err.println(userParam);
return "test";
}
@PostMapping("/test3")
public String test3(@Validated(UserUpdateGroup.class) UserParam userParam) {
System.err.println(userParam);
return "test";
}
}
自定义校验
自定义校验注解类 ListValue
package co.sekisuihouse.apServer.validated.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import co.sekisuihouse.apServer.validated.ListValueConstraintValidator;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class}) // 校验器需要自定义用什么要得校验器 多个以逗号隔开
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) // 哪都可以标注
@Retention(RUNTIME)
public @interface ListValue {
String message() default "{co.sekisuihouse.apServer.validated.annotation.ListValue.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
// 数组,需要用户自己指定
int[] value() default {};
}
自定义校验器 ListValueConstraintValidator
package co.sekisuihouse.apServer.validated;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import co.sekisuihouse.apServer.validated.annotation.ListValue;
import java.util.HashSet;
import java.util.Set;
public class ListValueConstraintValidator implements ConstraintValidator<ListValue, Integer> {// <注解,校验值类型>
// 存储所有可能的值
private Set<Integer> set = new HashSet<>();
// 初始化,你可以获取注解上的内容并进行处理
@Override
public void initialize(ListValue constraintAnnotation) {
// 获取后端写好的限制 // 这个value就是ListValue里的value,我们写的注解是@ListValue(value={0,1})
int[] value = constraintAnnotation.value();
for (int i : value) {
set.add(i);
}
}
// 覆写验证逻辑
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
// 看是否在限制的值里
return set.contains(value);
}
}
使用
public class UserParam {
@ListValue(value = { 0, 1 }, message = "只能是1或者是2", groups = { UserAddGroup.class, UserUpdateGroup.class })
private int sex;
}
controller
package co.sekisuihouse.apServer.controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import co.sekisuihouse.apServer.pojo.request.UserParam;
import co.sekisuihouse.apServer.validated.UserAddGroup;
import co.sekisuihouse.apServer.validated.UserUpdateGroup;
@RestController
public class TestController {
@PostMapping("/test")
public String test(@Validated(UserAddGroup.class) UserParam userParam) {
System.err.println(userParam);
return "test";
}
@PostMapping("/test3")
public String test3(@Validated(UserUpdateGroup.class) UserParam userParam) {
System.err.println(userParam);
return "test";
}
}
全局异常处理
package co.sekisuihouse.apServer.handler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import co.sekisuihouse.apServer.response.R;
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 表单验证异常处理
*/
@ExceptionHandler(value = BindException.class)
public R validExceptionHandler(BindException exception, HttpServletRequest request, HttpServletResponse response) {
/*
* 获取全部错误信息
*/
// List<FieldError> fieldErrors = exception.getFieldErrors();
// Map<String, String> errors = new HashMap<>();
// for (FieldError error : fieldErrors) {
// errors.put(error.getField(), error.getDefaultMessage());
// }
FieldError fieldError = exception.getFieldError();
return new R(-1, fieldError.getDefaultMessage());
}
}
常用注解
validator内置注解:
@Null:被注释的元素必须为null
@NotNull:被注释的元素必须不为null
@AssertTrue:被注释的元素必须为true
@AssertFalse:被注释的元素必须为false
@Min(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max, min):被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction):被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past:被注释的元素必须是一个过去的日期
@Future:被注释的元素必须是一个将来的日期
@Pattern(value):被注释的元素必须符合指定的正则表达式
Hibernate Validator 附加的注解:
@Email:被注释的元素必须是电子邮箱地址
@Length:被注释的字符串的大小必须在指定的范围内
@NotEmpty:被注释的字符串的必须非空
@Range:被注释的元素必须在合适的范围内
@NotBlank:验证字符串非null,且长度必须大于0
@Validated和@Valid区别
概要:
1.@Validated不支持嵌套校验,@Valid支持嵌套校验
2.@Validated可以用在其他被spring管理的类上,@Valid只能用在controller。
3.@Validated支持分组校验,@Valid不支持分组校验
4.@Validated可以做方法参数校验,
@Valid可用在
1. 方法,作用:TODO
2. 字段 ,作用:嵌套校验
3. 构造器, 作用:TODO
4. 参数,作用:开启校验验证功能
@Validated可用在
1. 类 ,作用: 对该类中的所有方法上的参数进行校验
2. 方法 ,作用:TODO
3. 参数,作用:开启校验验证功能
本文详细介绍了SpringBoot中如何使用JSR303进行数据校验,包括基本使用方法、分组校验的定义与应用、自定义校验注解和校验器的创建,以及控制器中异常的全局处理。同时,讨论了@Validated和@Valid的区别。
1278

被折叠的 条评论
为什么被折叠?



