使用hibernate-validate 校验参数bean

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)

限制字符长度必须在minmax之间


我们在使用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.验证工具


  1. package validation.util;  
  2.   
  3. import java.util.Set;  
  4.   
  5. import javax.validation.ConstraintViolation;  
  6. import javax.validation.Validation;  
  7. //import javax.validation.ValidationException;  
  8. import javax.validation.Validator;  
  9. import javax.validation.ValidatorFactory;  
  10. import javax.xml.bind.ValidationException;  
  11.   
  12. /**  
  13.  * @ClassName: VlidationUtil 
  14.  * @Description: 校验工具类  
  15.  * @author zhangyy  
  16.  * @date 2015-7-31 上午10:28:48   
  17.  */  
  18. public class VlidationUtil {  
  19.   
  20.     private static Validator validator;  
  21.       
  22.     static {  
  23.         ValidatorFactory vf = Validation.buildDefaultValidatorFactory();  
  24.         validator = vf.getValidator();  
  25.     }  
  26.       
  27.   
  28.     /** 
  29.      * @throws ValidationException  
  30.      * @throws ValidationException   
  31.      * @Description: 校验方法 
  32.      * @param t 将要校验的对象 
  33.      * @throws ValidationException  
  34.      * void 
  35.      * @throws  
  36.      */   
  37.     public static <T> void validate(T t) throws ValidationException{  
  38.         Set<ConstraintViolation<T>> set =  validator.validate(t);  
  39.         if(set.size()>0){  
  40.             StringBuilder validateError = new StringBuilder();  
  41.             for(ConstraintViolation<T> val : set){  
  42.                 validateError.append(val.getMessage() + " ;");  
  43.             }  
  44.             throw new ValidationException(validateError.toString());              
  45.         }  
  46.     }  
  47.       


6.注意: 以上的需要依赖其他的类库,下面是maven的依赖(该步骤不能忘记哦)

  1.  <dependency>  
  2.     <groupId>javax.validation</groupId>  
  3.       <artifactId>validation-api</artifactId>  
  4.       <version>1.1.0.Final</version>          
  5. </dependency>  
  6. <dependency>  
  7.        <groupId>org.ow2.util.bundles</groupId>  
  8.      <artifactId>hibernate-validator-4.3.1.Final</artifactId>  
  9.      <version>1.0.0</version>  
  10. </dependency> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值