一般都是在实体类上加上JSR303注解,例如:
public Class People{
@NotBlank
private String name;
}
在Controller中添加@valid或者@validated注解旨在接收到请求时进行JSR303的验证。
@RequestMappint("xxx")
public String get(@Valid People people){
......
}
但是把@Valid或者@Validated注解放在service层,直接调用service的方法是不会进行JSR303验证的。为此,显式的调用就显得尤为重要:
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<T>> constraintViolations = validator.validate(想要验证的bean);
ConstraintViolation<T> constraintViolation = getFirst(constraintViolations, null);
if (constraintViolation != null) {
throw new ValidationException(constraintViolation.getMessage());
}
使用javax.validation.Validator即可做到在任何地点显式验证JSR303
=========全局验证====
package com.mmall.util; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.mmall.exception.ParamException; import org.apache.commons.collections.MapUtils; import javax.validation.*; import java.util.*; public class BeanValidator { public static ValidatorFactory validatorFactory= Validation.buildDefaultValidatorFactory(); public static <T>Map<String,String> validate(T t,Class... groups){ Validator validator=validatorFactory.getValidator(); Set validateResult=validator.validate(t,groups); if (validateResult.isEmpty()){ return Collections.emptyMap(); }else { LinkedHashMap errors= Maps.newLinkedHashMap(); Iterator iterator=validateResult.iterator(); while (iterator.hasNext()){ ConstraintViolation violation=(ConstraintViolation) iterator.next(); errors.put(violation.getPropertyPath().toString(),violation.getMessage()); } return errors; } } public static Map<String,String> validateList(Collection<?> collection){ Preconditions.checkNotNull(collection); Iterator iterator=collection.iterator(); Map errors; do{ if(!iterator.hasNext()){ return Collections.emptyMap(); } Object object =iterator.next(); errors=validate(object,new Class[0]); }while (errors.isEmpty()); return errors; } public static Map<String,String> validatorObject(Object first,Object... objects){ if (objects!=null && objects.length>0){ return validateList(Lists.asList(first,objects)); }else { return validate(first,new Class[0]); } } public static void check(Object param) throws ParamException{ Map<String,String> map=BeanValidator.validatorObject(param); if (MapUtils.isNotEmpty(map)){ throw new ParamException(map.toString()); } } }
@RequestMapping("/validate.json") @ResponseBody public JsonData validate(TestVo vo) throws ParamException{ log.info("validate"); BeanValidator.check(vo); return JsonData.success("test validate"); }