validation校驗----可以用來對於請求bean的必填引數進行校驗
阿新 • • 發佈:2018-12-10
validation的另一種用法,這種用法更加簡單便捷校驗工具類:
package com.alibaba.banff.web.util; 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 lizhilong */ public class ValidationUtils { private static Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); public static <T> ValidationResult validateEntity(T obj) { ValidationResult result = new ValidationResult(); Set<ConstraintViolation<T>> set = validator.validate(obj, Default.class); // if( CollectionUtils.isNotEmpty(set) ){ if (set != null && set.size() != 0) { result.setHasErrors(true); Map<String, String> errorMsg = new HashMap<String, String>(); for (ConstraintViolation<T> cv : set) { errorMsg.put(cv.getPropertyPath().toString(), cv.getMessage()); } result.setErrorMsg(errorMsg); } return result; } public static <T> ValidationResult validateProperty(T obj, String propertyName) { ValidationResult result = new ValidationResult(); Set<ConstraintViolation<T>> set = validator.validateProperty(obj, propertyName, Default.class); if (set != null && set.size() != 0) { result.setHasErrors(true); Map<String, String> errorMsg = new HashMap<String, String>(); for (ConstraintViolation<T> cv : set) { errorMsg.put(propertyName, cv.getMessage()); } result.setErrorMsg(errorMsg); } return result; } }
校驗工具類返回的資料ValidationResult(省略getset):
package com.aliyun.prophet.facade.partner.flaw;
import java.util.Map; /** * 校驗結果 * * @author lizhilong */ public class ValidationResult { // 校驗結果是否有錯 private boolean hasErrors; // 校驗錯誤資訊 private Map<String, String> errorMsg; }
Person類(省略getset):
package com.aliyun.prophet.facade.partner.flaw;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; public class Person { @Length(max=20,message="姓名長度不能大於20") @NotEmpty(message="姓名不能為空") private String name; @Range(min = 0, max = 1, message = "性別只能輸入只能輸入0或1") private Integer gender; private Integer age; }</span></code></pre>
使用方法:
/**
*
* @author: lizhilong
*/
public class Test {
@org.junit.Test
public void testValidation(){
Person person = new Person();
person.setAge(12);
person.setGender(2);
// person.setName("李智龍");
ValidationResult result = ValidationUtils.validateEntity(person);
Map<String, String> map = result.getErrorMsg();
boolean isError = result.isHasErrors();
System.out.println("isError: " +isError);
System.out.println(map);
}
}
列印結果:
isError: true
{gender=性別只能輸入只能輸入0或1, name=姓名不能為空}
對於ValidationResult校驗結果我們還可以進一步的封裝
/**
*這個方法的作用就是對於ValidationResult 返回結果
*
* @param request
*/
private String validateParam(S request) {
StringBuilder sbd = new StringBuilder();
ValidationResult result = ValidationUtil.validateEntity(request);
if (result.isHasErrors()) {
result.getErrorMsg().forEach((k, v) -> {
sbd.append(v).append("&");
});
}
return sbd.deleteCharAt(sbd.length() - 1).toString();
}