- 在日常开发中,需要对前端提交的表单进行参数校验,甚至是参数的多层次校验。
- 导包
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
- 校验实体与控制器如下
public class Student {
@NotNull(message = "id不能为空")
private Long id;
@NotBlank(message = "姓名不能为空")
private String name;
@Valid //添加这个注解就可以嵌套校验
@NotEmpty(message = "请填写爱好") //校验集合不为空
@Size(max = 2, message = "爱好不能超过{max}个")
private List<Hobby> hobbies;
...
}
public class Hobby {
private Long id;
@NotBlank(message = "请填写爱好")
private String like;
...
}
@Validated
@RestController
public class DemoController {
/**
* post请求校验参数 参数中添加@Validated注解
* @param student
* @return
*/
@PostMapping("/post")
public JSONResult post(@RequestBody @Validated Student student) {
System.out.println(student);
return JSONResult.success(student);
}
/**
* get请求校验参数 controller上添加 @Validated注解
* @author luo jiang
* @date 2021/1/26
* @param id
*/
@GetMapping("/get")
public JSONResult get(@NotNull(message = "id不能为空") Long id) {
System.out.println(id);
return JSONResult.success(id);
}
}
- 配置全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 校验异常
*
* @param e
* @return
*/
@ExceptionHandler(UnexpectedTypeException.class)
@ResponseBody
public JSONResult validationException(UnexpectedTypeException e) {
logger.error("参数校验异常:", e);
return JSONResult.failure(e.getMessage());
}
/**
* Hibernate Validator参数校验异常处理
*
* @param e
* @return
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public JSONResult handler(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().get(0);
return JSONResult.failure(-1, objectError.getDefaultMessage());
}
/**
* 未被关注的异常信息,统一返回给客户端为“系统异常”
*
* @param e
* @param response
* @param request
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public JSONResult exceptionHandler(Exception e, HttpServletResponse response, HttpServletRequest request) {
return JSONResult.failure(-1, "系统异常");
}
}
- 分组校验
- 新建两个校验组 和校验类
/**
*功能描述 草稿分组校验
* @author luo jiang
* @date 2021/1/26
*/
public interface DraftGroup {
}
/**
* 功能描述 保存分组校验
* @author luo jiang
* @date 2021/1/26
*/
public interface SaveGroup {
}
public class Tenant {
@NotNull(message = "id不能为空", groups = {SaveGroup.class})
private Long id;
@Length(max = 5, message = "名称不能超过{max}个字符", groups = {DraftGroup.class, SaveGroup.class})
private String name;
@Length(max = 5, message = "简介不能超过{max}个字符", groups = {SaveGroup.class})
private String intro;
// SaveGroup校验所有参数 DraftGroup校验 name
...
}
/**
* 功能描述 分组校验 @Validated指定校验组
* @author luo jiang
* @date 2021/1/26
* @param tenant
* @return com.luojiang.validator.util.JSONResult
*/
@PostMapping("/saveGroup")
public JSONResult saveGroup(@RequestBody @Validated(SaveGroup.class) Tenant tenant) {
System.out.println(tenant);
return JSONResult.success(tenant);
}
/**
* 功能描述 分组校验 @Validated指定校验组
* @author luo jiang
* @date 2021/1/26
* @param tenant
* @return com.luojiang.validator.util.JSONResult
*/
@PostMapping("/draftGroup")
public JSONResult draftGroup(@RequestBody @Validated(DraftGroup.class) Tenant tenant) {
System.out.println(tenant);
return JSONResult.success(tenant);
}
校验结果
SaveGroup
DraftGroup
项目地址