三种校验包区分
-
JSR303是一项标准,JSR-349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如@Null,@NotNull,@Pattern,他们位于javax.validation.constraints包下,只提供规范不提供实现。
-
hibernate validation是对这个规范的实践(不要将hibernate和数据库orm框架联系在一起),他提供了相应的实现,并增加了一些其他校验注解,如@Email,@Length,@Range等等,他们位于org.hibernate.validator.constraints包下。
-
万能的spring为了给开发者提供便捷,对hibernate validation进行了二次封装,校验validated bean时,你可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。
此段内容借鉴:https://blog.csdn.net/u013815546/article/details/77248003
springboot实例
-
导包:spring-boot-starter-web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
我们观察项目依赖树:
我们可以发现这个包已经自动报我们导入了hibernate validation包了,这也验证了上一步的内容。 -
编写实体类User
import lombok.Data; import javax.validation.constraints.Email; import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; @Data public class User { @NotBlank @Pattern(regexp = "^\\w+$",message = "用户名不合法") private String username; @Min(value = 18,message = "年龄要大于18") private int age; @Email(message = "邮箱不合法") private String email; }
-
编写返回的类ResponseEntity
@Data public class ResponseEntity<T> { private T data; private String status; private int code; public ResponseEntity() { } public ResponseEntity(T data, String status, int code) { this.data = data; this.status = status; this.code = code; } public ResponseEntity(StatusCode statusCode) { this.status = statusCode.getStatus(); this.code = statusCode.getCode(); } }
-
编写controller类
备注:不考虑分组校验功能用@Valid和@Validated效果都一样,@Validated支持分组校验。@ResponseBody @RequestMapping(value = "/testValidate", method = RequestMethod.POST) public ResponseEntity testValidate(@Validated @RequestBody User user, BindingResult bindingResult) { ResponseEntity res = new ResponseEntity(); if (bindingResult.hasErrors()) { res = new ResponseEntity(); //用于存储校验错误信息 ArrayList<String> errs = new ArrayList(); for (ObjectError error : bindingResult.getAllErrors()) { errs.add(error.getDefaultMessage()); } res.setData(errs); res.setCode(300); res.setStatus("校验失败"); } else { res.setData(null); res.setCode(200); res.setStatus("校验成功"); } return res; }
-
验证结论:
分组校验
1.三个分组接口
public interface Group1 {
}
public interface Group2 {
}
@GroupSequence({Group1.class,Group2.class})
public interface AllGroup {
}
2.实体类准备
import javax.validation.constraints.*;
@Data
public class User {
@NotBlank(message = "姓名不能为空", groups = {Group1.class})
@Pattern(regexp = "^\\w*$", message = "用户名只能是数字", groups = {Group2.class})
private String username;
@NotNull(message = "年龄不能为空", groups = {Group1.class})
@Min(value = 18, message = "年龄要大于18", groups = {Group2.class})
private int age;
@NotBlank(message = "邮箱不能为空", groups = {Group1.class})
@Email(message = "邮箱不合法", groups = {Group2.class})
private String email;
}
3.controller类:
@ResponseBody
@RequestMapping(value = "/testValidate", method = RequestMethod.POST)
public ResponseEntity testValidate(@Validated(AllGroup.class) @RequestBody User user, BindingResult bindingResult) {
ResponseEntity res = new ResponseEntity();
if (bindingResult.hasErrors()) {
res = new ResponseEntity();
//用于存储校验错误信息
ArrayList<String> errs = new ArrayList();
for (ObjectError error : bindingResult.getAllErrors()) {
errs.add(error.getDefaultMessage());
}
res.setData(errs);
res.setCode(300);
res.setStatus("校验失败");
} else {
res.setData(null);
res.setCode(200);
res.setStatus("校验成功");
}
return res;
}
}
4.测试
(1) 分组1未通过
(2) 分组1通过,分组2未通过
(3) 校验通过