validate最佳实战
零、maven依赖
<validation-api.version>1.0.0.GA</validation-api.version> <hibernate-validator.version>4.2.0.Final</hibernate-validator.version> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>${validation-api.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${hibernate-validator.version}</version> </dependency>
一、定义工具类
import tf56.hermescontractweb.common.exception.MyException; // 自定义异常 import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.Iterator; import java.util.Set; public class MyValidate { public MyValidate() { } public static <T> void validate(T object) { if (null == object) { throw new MyException("请求数据不能为空"); } else { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, new Class[0]); validate(constraintViolations); } } public static <T> void validate(T object, int... errCode) { if (null == object) { throw new MyException(errCode[0]); } else { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, new Class[0]); validate(constraintViolations, errCode); } } public static <T> void validate(T object, Class group, int... errCode) { if (null == object) { throw new MyException(errCode[0]); } else { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, new Class[]{group}); validate(constraintViolations, errCode); } } public static <T> void validate(T object, Class group) { if (null == object) { throw new MyException("请求数据不能为空"); } else { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<T>> constraintViolations = validator.validate(object, new Class[]{group}); validate(constraintViolations); } } private static <T> void validate(Set<ConstraintViolation<T>> constraintViolations) { if (!constraintViolations.isEmpty()) { StringBuffer error = new StringBuffer(); String errorResult = ""; Iterator var3 = constraintViolations.iterator(); while(var3.hasNext()) { ConstraintViolation<T> constraintViolation = (ConstraintViolation)var3.next(); if (constraintViolation != null) { error.append(constraintViolation.getMessage() + ","); } } if (error.length() > 0) { errorResult = error.toString().substring(0, error.toString().length() - 1); } throw new MyException(500, errorResult); } } private static <T> void validate(Set<ConstraintViolation<T>> constraintViolations, int... errCode) { if (!constraintViolations.isEmpty()) { StringBuffer error = new StringBuffer(); String errorResult = ""; Iterator var4 = constraintViolations.iterator(); while(var4.hasNext()) { ConstraintViolation<T> constraintViolation = (ConstraintViolation)var4.next(); if (constraintViolation != null) { error.append(constraintViolation.getMessage() + ","); } } if (error.length() > 0) { errorResult = error.toString().substring(0, error.toString().length() - 1); } throw new MyException(errCode[1], errorResult); } } }
二、请求入参JavaBean
@Data public class MyValidateReq implements Serializable { @ApiModelProperty(value = "商户id(前端无需传值,后端从session中获取)", example = "123456", required = true) @NotNull(message = "商户id不能为空", groups = {MyCreate.class, MyQuery.class}) private Integer merchantId; @ApiModelProperty(value = "模板名", example = "templateName", required = true) @NotBlank(message = "模板名不能为空", groups = {MyCreate.class}) @Size(max = 5, message = "模板名超长", groups = {MyCreate.class}) private String templateName; }
三、自定义group
public interface MyCreate {} public interface MyQuery {}
四、单测示例
@Test public void validateTest() { MyValidateReq req = new MyValidateReq(); req.setMerchantId(null); req.setTemplateName("123456"); /** * 注意事项: * 若MyValidateReq未使用groups进行分组,可以直接使用validate(req)方法进行校验; * 若MyValidateReq使用groups进行分组,只能使用validate(req, group)进行校验;validate(req)无效 */ validate(req, MyCreate.class); validate(req, MyQuery.class); } private void validate(MyValidateReq req, Class group) { try { MyValidate.validate(req, group); } catch (Exception e) { System.out.println("MyValidateReq having Exception:" + e.getMessage()); } }