1. 程式人生 > >JSR303完成validate校驗並編寫BeanValidator工具類

JSR303完成validate校驗並編寫BeanValidator工具類

mex map() obj dde fir ash ret span enc

一、引入pom依賴

<!-- validator -->
<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.4.Final</version> </dependency>

二、針對需要驗證的字段封裝為TestVo

@Validated
@Data
public class TestVo {

    @NotNull
    private Integer id ;

    @NotBlank
    private String name;
}

三、工具類BeanValidator編寫

技術分享圖片
 1 public class BeanValidator {
 2 
 3     private static ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
 4 
 5     /**
 6      * 校驗對象
 7      * @param t 對象的泛型
 8      * @param groups
 9      * @param <T>
10      * @return
11      */
12     public static
<T>Map<String,String> validate(T t,Class... groups){ 13 Validator validator = validatorFactory.getValidator(); 14 Set validateResult = validator.validate(t, groups); 15 if(validateResult.isEmpty()){ 16 return Collections.emptyMap(); 17 }else { 18 LinkedHashMap errors = Maps.newLinkedHashMap(); 19 Iterator iterator = validateResult.iterator(); 20 while (iterator.hasNext()){ 21 ConstraintViolation violation = (ConstraintViolation) iterator.next(); 22 errors.put(violation.getPropertyPath().toString(),violation.getMessage()); 23 } 24 return errors; 25 } 26 } 27 28 /** 29 * 校驗集合 30 * @param collection 集合 31 * @return 32 */ 33 public static Map<String,String> validateList(Collection<?> collection){ 34 Preconditions.checkNotNull(collection); 35 Iterator iterator = collection.iterator(); 36 Map errors; 37 do{ 38 if (!iterator.hasNext()) { 39 return Collections.emptyMap(); 40 } 41 Object object = iterator.next(); 42 errors = validate(object,new Class[0]); 43 }while (errors.isEmpty()); // 如果errors為空則循環校驗,一旦不為空 跳出循環 44 return errors; 45 } 46 47 /** 48 * 通用方法,至少傳入一個Object參數 49 * <p>校驗參數之後不會處理只會將錯誤信息存儲到map中 50 * @param first 51 * @param objects 52 */ 53 public static Map<String,String> validateObject(Object first,Object... objects){ 54 if(objects == null || objects.length == 0){ 55 return validate(first,new Class[0]); 56 }else { 57 return validateList(Lists.asList(first,objects)); 58 } 59 } 60 61 /** 62 * 校驗參數是否合法 63 * <p>當校驗參數不合法時拋出異常讓程序不能繼續執行 64 * @param param 65 * @throws ParamException 66 */ 67 public static void check(Object param)throws ParamException{ 68 Map<String, String> map = validateObject(param); 69 if(MapUtils.isNotEmpty(map)){ 70 throw new ParamException(map.toString()); 71 } 72 } 73 }
View Code

四、Controller類中調用並測試

@Controller
@Slf4j
@RequestMapping("/test")
public class TestController {

    @RequestMapping("/testVo.json")
    @ResponseBody
    public String testVo(TestVo testVo)throws ParamException{
        log.info("testVo");
        Map<String, String> map = BeanValidator.validateObject(testVo);
        if(MapUtils.isNotEmpty(map)){
            for(Map.Entry<String,String> entry :map.entrySet()){
                log.error("error==={}-->{}",entry.getKey(),entry.getValue());
            }
        }
        //BeanValidator.check(testVo);
        return "hello world";
    }

}

運行就會輸出這樣的日誌信息:

技術分享圖片

JSR303完成validate校驗並編寫BeanValidator工具類