hibernate-validate是基于jsr303的,
JSR-303原生支持的限制有如下几种:
限制 | 说明 |
@Null | 限制只能为null |
@NotNull | 限制必须不为null |
@AssertFalse | 限制必须为false |
@AssertTrue | 限制必须为true |
@DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
@DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
@Future | 限制必须是一个将来的日期 |
@Max(value) | 限制必须为一个不大于指定值的数字 |
@Min(value) | 限制必须为一个不小于指定值的数字 |
@Past | 限制必须是一个过去的日期 |
@Pattern(value) | 限制必须符合指定的正则表达式 |
@Size(max,min) | 限制字符长度必须在min到max之间 |
我们在使用bean校验时候
1先创建校验的bean
package com.hlmedicals.app.vo;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;
import org.springframework.beans.factory.annotation.Autowired;
import com.hlmedicals.app.annotation.OrgCodeVlidator;
public class DoctorRegisterParamVO {
@NotEmpty(message = "真实姓名不能为空")
private String realName;
@NotEmpty(message = "身份证号码不能为空")
private String idcard;
@NotNull(message = "性别不能为空")
@Range(min = 0, max = 1,message="参数异常不能注册,请按规则填写 0女1男")
private int sex;
@NotNull(message = "电话号不能为空")
private long mobilePhone;
@NotEmpty(message = "机构编码不能为空")
@OrgCodeVlidator
private String orgCode;
//@NotEmpty(message = "注册帐号不能为空")
private String username;
//@NotEmpty(message = "密码不能为空")
private String password;
/**
* @return the realName
*/
public String getRealName() {
return realName;
}
/**
* @param realName the realName to set
*/
public void setRealName(String realName) {
this.realName = realName;
}
/**
* @return the idcard
*/
public String getIdcard() {
return idcard;
}
/**
* @param idcard the idcard to set
*/
public void setIdcard(String idcard) {
this.idcard = idcard;
}
/**
* @return the sex
*/
public int getSex() {
return sex;
}
/**
* @return the mobilePhone
*/
public long getMobilePhone() {
return mobilePhone;
}
/**
* @param mobilePhone the mobilePhone to set
*/
public void setMobilePhone(long mobilePhone) {
this.mobilePhone = mobilePhone;
}
/**
* @param sex the sex to set
*/
public void setSex(int sex) {
this.sex = sex;
}
/**
* @return the orgCode
*/
public String getOrgCode() {
return orgCode;
}
/**
* @param orgCode the orgCode to set
*/
public void setOrgCode(String orgCode) {
this.orgCode = orgCode;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
}
2.后台controller处理(用@valid标示要验证的bean,没有这个该beab不会被验证,验证结果我们放到bindingResult里,如果有错误就相应的返回错误信息)
@RequestMapping(value="/doctorRegister",method=RequestMethod.POST)
public JsonRe doctorRegister(HttpServletRequest req,HttpServletResponse res,@Valid DoctorRegisterParamVO doctorRegister,BindingResult bindingResult){
JsonRe jsonRe=new JsonRe();
if(bindingResult.hasErrors()) {
List<FieldError> list = bindingResult.getFieldErrors();
for (FieldError fieldError : list) {
System.out.println(fieldError.getDefaultMessage());
jsonRe.setMessage(fieldError.getDefaultMessage());
break;
}
jsonRe.setCode(202106);
return jsonRe;
}
3.注意
使用hibernate validator出现上面的错误, 需要 注意
@NotNull 和 @NotEmpty 和@NotBlank 区别
@NotEmpty 用在集合类上面@NotBlank 用在String上面
@NotNull 用在基本类型上
4.上面有一个自定义的校验注解@OrgCodeVlidator
具体实现
package com.hlmedicals.app.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy={OrgCodeVlidatorImpl.class})
public @interface OrgCodeVlidator {
String message() default "请填写正确的机构编码"; // 约束注解验证时的输出消息
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
上面代码指出了约束校验指定的类(我们该校验主要是看该值是否在数据库中,)
package com.hlmedicals.app.annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hlmedicals.app.service.HisDepartService;
public class OrgCodeVlidatorImpl implements ConstraintValidator<OrgCodeVlidator, String>{
@Autowired
private HisDepartService hisDepartService;
@Override
public void initialize(OrgCodeVlidator arg0) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value==null || value.length()<=0){
return false;
}else{
try {
return hisDepartService.exists(value);
} catch (Exception e) {
return false;
}
}
}
}
这样校验就完成了。
5.验证工具
- package validation.util;
- import java.util.Set;
- import javax.validation.ConstraintViolation;
- import javax.validation.Validation;
- //import javax.validation.ValidationException;
- import javax.validation.Validator;
- import javax.validation.ValidatorFactory;
- import javax.xml.bind.ValidationException;
- /**
- * @ClassName: VlidationUtil
- * @Description: 校验工具类
- * @author zhangyy
- * @date 2015-7-31 上午10:28:48
- */
- public class VlidationUtil {
- private static Validator validator;
- static {
- ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
- validator = vf.getValidator();
- }
- /**
- * @throws ValidationException
- * @throws ValidationException
- * @Description: 校验方法
- * @param t 将要校验的对象
- * @throws ValidationException
- * void
- * @throws
- */
- public static <T> void validate(T t) throws ValidationException{
- Set<ConstraintViolation<T>> set = validator.validate(t);
- if(set.size()>0){
- StringBuilder validateError = new StringBuilder();
- for(ConstraintViolation<T> val : set){
- validateError.append(val.getMessage() + " ;");
- }
- throw new ValidationException(validateError.toString());
- }
- }
- }
6.注意: 以上的需要依赖其他的类库,下面是maven的依赖(该步骤不能忘记哦)
- <dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>1.1.0.Final</version>
- </dependency>
- <dependency>
- <groupId>org.ow2.util.bundles</groupId>
- <artifactId>hibernate-validator-4.3.1.Final</artifactId>
- <version>1.0.0</version>
- </dependency>