在SpringBoot 中使用服务器端的数据校验和单独使用SpringMVC 中的数据校验采用的都是 JSR303 这个规范的实现产品Hibernate-Validate。
一、JSR-303简介:JSR 303 - Bean Validation 介绍及最佳实践JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是Hibernate Validator。
此实现与 Hibernate ORM 没有任何关系。 JSR 303 用于对 Java Bean 中的字段的值进行验证。
Spring MVC 3.x 之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
JSR-303 是一个数据验证的规范,但是 spring 并没有对其进行实现,Hibernate Validator 是实现了这一规范的,JSR-303可以使用注解的方式进行验证,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。
常用校验注解
1、SpringBoot 已经将相关的jar包整合进来了,所以不用自己导包2、在 JavaBean 的属性上加验证注解(可自定义错误提示信息)
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.util.Date;
@Entity
@Table(name = "t_user")
public class User {
private int id;
@NotEmpty(message = "用户名不能为空")
private String username;
@NotEmpty
private String password;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date regDate;
private Address address;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
@Column(name = "reg_date")
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
// 多(用户)对一(地址)
@ManyToOne
@JoinColumn(name = "address_id")
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", regDate=" + regDate +
", address=" + address +
'}';
}
}
import javax.persistence.*;
@Entity
@Table(name = "t_address")
public class Address {
private int id;
private String addressInfo;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "address_info")
public String getAddressInfo() {
return addressInfo;
}
public void setAddressInfo(String addressInfo) {
this.addressInfo = addressInfo;
}
@Override
public String toString() {
return "Address{" +
"id=" + id +
", addressInfo='" + addressInfo + '\'' +
'}';
}
}
3、在Controller的处理方法上的参数前,加@Valid注解,错误信息放置的对象参数 Errors/BindingResult errorrs。
@Controller
public class UserController {
/**
* @param user 做有效性校验,必须要有这个参数
* @param model
* @return
*/
@GetMapping("/addUser")
public String addUser(User user, Model model){
List addressList = addressService.getAllAddress();
model.addAttribute("addressList", addressList);
return "addUser";
}
/**
* @param user valid注解:开启校验,
* @param errors Errors/BindingResult 必须紧跟在校验对象之后
* @param model
* @return
*/
@PostMapping("/adduser")
public String adduser(@Valid User user, BindingResult errors, Model model){
if(errors.getErrorCount() > 0){
// 错误信息,可以在thymeleaf模板引擎中用th:errors="${}"来回显。
// 原本页面关联的信息也要回显
List addressList = addressService.getAllAddress();
model.addAttribute("addressList", addressList);
return "addUser";
}
user.setRegDate(new Date());
userService.add(user);
return "redirect:userList";
}
}
4、页面中用 th:errors="${}" 来显示不满足要求的数据的信息。
添加用户
用户名:
用户密码:
选中用户地址:
[[${address.addressInfo}]]
由于 springmvc 会将该对象放入到model中传递,key 的名称会使用该对象的驼峰命名规则来作为key,参数的变量名需要与对象的名称相同,将首字母小写。
如果想改个名称,用注解 @ModelAttribute() 来标明。
@Controller
public class UserController {
/**
* @param user 做有效性校验,必须要有这个参数
* @param model
* @return
*/
@GetMapping("/addUser")
public String addUser(@ModelAttribute(value = "uu") User user, Model model){
List addressList = addressService.getAllAddress();
model.addAttribute("addressList", addressList);
return "addUser";
}
/**
* @param user valid注解:开启校验,
* @param errors Errors/BindingResult 必须紧跟在校验对象之后
* @param model
* @return
*/
@PostMapping("/adduser")
public String adduser(@Valid @ModelAttribute(value = "uu") User user, BindingResult errors, Model model){
if(errors.getErrorCount() > 0){
// 错误信息,可以在thymeleaf模板引擎中用th:errors="${}"来回显。
// 原本页面关联的信息也要回显
List addressList = addressService.getAllAddress();
model.addAttribute("addressList", addressList);
return "addUser";
}
user.setRegDate(new Date());
userService.add(user);
return "redirect:userList";
}
}
用户名:
用户密码:
选中用户地址:
[[${address.addressInfo}]]
ends ~