Java JSR303 valid

     不管是html页面表单提交的对象数据还是和第三方公司进行接口对接,都需要对接收到的数据进行校验(非空、长度、格式等等)。如果使用if一个个进行校验(字段非常多),这是让人崩溃的过程。幸好jdk或hibernate都提供了对object对象的校验,只需加上相应的注解即可。

     本人喜欢学习时,都建立个maven小项目进行实践学习。

  1. 首先引入包的管理
    	    <dependency>  
    	        <groupId>javax.el</groupId>  
    	        <artifactId>javax.el-api</artifactId>  
    	        <version>2.2.4</version>  
    	    </dependency> 
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <version>1.1.0.Final</version>
            </dependency>
            <dependency>  
    		    <groupId>org.hibernate</groupId>  
    		    <artifactId>hibernate-validator</artifactId>  
    		    <version>5.2.2.Final</version>  
    		</dependency>  
    
        
  2. 实现校验类并使用
    package com.sk.browser.utils;
    
    import java.util.HashMap;
    import java.util.Map;  
    import java.util.Set;  
      
    import javax.validation.ConstraintViolation;  
    import javax.validation.Validation;  
    import javax.validation.Validator;  
    import javax.validation.groups.Default;
    
    
    /**
     * 数据验证工具类
    * @author 高国藩
    * @date 2017年4月25日 上午10:32:24
     */
    public class ValidatorUtil {
    
        private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
    
        public static <T> Map<String, StringBuffer> validate(T obj) {
            Map<String, StringBuffer> errorMap = null;
            Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class);
            if (set != null && set.size() > 0) {
                errorMap = new HashMap<String, StringBuffer>();
                String property = null;
                for (ConstraintViolation<T> cv : set) {
                    property = cv.getPropertyPath().toString();
                    if (errorMap.get(property) != null) {
                        errorMap.get(property).append("," + cv.getMessage());
                    } else {
                        StringBuffer sb = new StringBuffer();
                        sb.append(cv.getMessage());
                        errorMap.put(property, sb);
                    }
                }
            }
            return errorMap;
        }
        
    }
    

     

  3. 自定义校验类
    package com.sk.system.validator;
    
    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;  
    
    /**
     * 定义valid管理器
    * @author 高国藩
    * @date 2017年4月25日 上午11:16:37
     */
    public class CustomValidation {
        
        /**
         *  定义金额校验
        * @author 高国藩
        * @date 2017年4月25日 上午11:06:01
         */
        @Target({ElementType.FIELD, ElementType.METHOD})  
        @Retention(RetentionPolicy.RUNTIME)  
        @Constraint(validatedBy=MoneyValidator.class)  
        public @interface Money {  
            String message() default "金额格式不正确";  
            Class<?>[] groups() default {};  
            Class<? extends Payload>[] payload() default {};  
        }
    }
    
    package com.sk.system.validator;
    
    import java.util.regex.Pattern;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    import com.sk.system.validator.CustomValidation.Money;
    
    public class MoneyValidator implements ConstraintValidator<Money, Double> {
        
        private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金额的正则表达式  
        private Pattern moneyPattern = Pattern.compile(moneyReg);  
    
        @Override
        public void initialize(Money arg0) {
            
        }
    
        @Override
        public boolean isValid(Double arg0, ConstraintValidatorContext arg1) {
            if (arg0 == null)  
                //金额是空的,返回true,是因为如果null,则会有@NotNull进行提示  
                //如果这里false的话,那金额是null,@Money中的message也会进行提示  
                //自己可以尝试  
                return true;  
            return moneyPattern.matcher(arg0.toString()).matches();  
        }
    
    }
    

     

  4. 校验注解汇总

         

         其中有一个要注意的就是@NotBlack,只针对String类型有用

         另外一点就是javaConfig中的springMvc配置jsr303数据类型校验不起作用的原因,还未找到,请大家明白的及时联系我,感谢了 ~~~

转载于:https://my.oschina.net/gaoguofan/blog/886640

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值