数据校验:
JSR303 --> Hibernate Validator
使用Hibernate Validator 步骤:
1.导入jar包
Hibernate-validator-4.3.0.jar --注意版本问题 Hibernate-api-1.0.0.jar Hibernate-Validator-annotation-pro.... classmate.jar jboss-logging-3.1.0.jar
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.1.3.Final</version> </dependency>
2.配置
<mvc:annotation-driven></mvc:annotation-driven>
此时mvc:annotation-driven作用:要实现Hibernate Validator/JSR303(或其他各种校验),必须实现ValidatorFactory接口,
LocalValidatorFactoryBean是SpringMVC已经写好的类(集成与ValidatorFactory接口),
上面的配置会自动把这个Bean配置到容器中.
3.注解使用
(1)在实体Bean字段中 加规则(正则表达式等).
(2)在Controller中,给校验的字段对象加@Valid
(3)如何获取校验结果 BindingResult result (接收类型BindingResult必须在校验字段的后面,再是如果用了关联类,需要关联验证,在类变量上也需加上@Valid)
@RequestMapping("/listparam") public String listparam (@Valid CompanyAndTypeListPojo ctlps,BindingResult result) { System.out.println(result.getErrorCount()); if(result.getErrorCount()>0) { for(FieldError error : result.getFieldErrors()) { System.out.println(JSON.toJSONString(error)); } } //或 if(result.hasErrors()){ for (ObjectError error : result.getAllErrors()) { System.out.println(error.getDefaultMessage()); } } this.model.addAttribute("action_type", "集合类型(map,list)搜索结果"); String req_data = JSON.toJSONString(ctlps); this.model.addAttribute("req_data", req_data); return "home/helloworld/test1"; }
例子1: (非javaWeb例子)
1)先建立 CompanyPojo类:
package com.cc8w.entity; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; public class CompanyPojo { private int id=0; @NotBlank(message="公司名称不能为空") @Size(min=8, max=30,message = "请检查公司名称的长度是否有问题") private String c_name=""; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getC_name() { return c_name; } public void setC_name(String c_name) { this.c_name = c_name; } }
2).验证
//实例化要测试的Bean CompanyPojo cp = new CompanyPojo(); cp.setC_name("1"); cp.setId(1); //1.创建工厂 ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); //2.通过工厂获取校验对象validator Validator validator = factory.getValidator(); //3.校验模型对象 Set<ConstraintViolation<CompanyPojo>> constraintViolation = validator.validate(cp); //4.通过iterator遍历校验后的结果 Iterator<ConstraintViolation<CompanyPojo>>iterator = constraintViolation.iterator(); while(iterator.hasNext()) { ConstraintViolation<CompanyPojo> cat = iterator.next(); System.out.println(cat.getPropertyPath());//出错的字段名 System.out.println(cat.getMessage());//出错的信息 }
==================================================================
补充,引用 类变量,也生效校验规则
@Data public class CompanyAndTypePojo { @Valid //加上校验CompanyPojo类的验证规则生效,反之则不生效 private CompanyPojo company; private CompanyTypePojo company_type; }