因为一些特性的校验规则,validator自带的注解并不能完全满足需求,当然它也提供了正则校验,但是正则校验只能是字符串类型,当我遇到需要校验byte类型的参数时,只能想到了实现自定义注解。
1.首先需要依赖包,我这里用到的是hibernate-validator包
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
2.添加自定义注解 ByteCheck 注解类
package com.bn.lbs.base.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @author king
*/
@Documented
@Constraint(validatedBy = CheckByteValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ByteCheck {
String message() default "请传入符合要求的Byte值";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
3.自定义枚举校验的处理类,该类必须实现ConstraintValidator接口
package com.bn.lbs.base.annotation;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;
/**
* @author king
*/
public class CheckByteValidator implements ConstraintValidator<ByteCheck, Byte> {
@Override
public void initialize(ByteCheck constraintAnnotation) {
}
@Override
public boolean isValid(Byte value, ConstraintValidatorContext context) {
if(StringUtils.isEmpty(value)){
return false;
}
String regex = "^[0|1]$";
return Pattern.matches(regex, String.valueOf(value));
}
}
4.在代码中添加相应的注解
/**
* 是否启用
* 1/0 禁用/启用
*/
@ApiModelProperty(value = "1/0 禁用/启用")
@ByteCheck(message = "启用状态字段只能为 启用或禁用")
private Byte isDisabled;
5.校验可以在controller中添加@validator或者@valid注解,我这里用的是自定义返回处理,所以封装了校验器工具类
package com.bn.lbs.base.support;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.*;
/**
* 两种方法,只是返回结果形式不同而已
*/
public class ValidatorUtils {
protected static Logger logger = LoggerFactory.getLogger("com.bn.lbs.base.support.ValidatorUtils");
public static Map<String, String> validator(Object obj) {
Map<String, String> errors = new HashMap<String, String>();
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
Set<ConstraintViolation<Object>> validate = validator.validate(obj);
for (ConstraintViolation<Object> cv : validate) {
System.err.println(cv);
String key = cv.getPropertyPath().toString();
String msg = cv.getMessage();
if (errors.containsKey(key)) {
String last = errors.get(key);
errors.put(key, msg + "&" + last);
} else {
errors.put(key, msg);
}
}
if(errors.size()>0) {
logger.error("参数较验结果:{}",errors.toString());
}
return errors;
}
public static List<String> validatorList(Object obj) {
List<String> errorList= new ArrayList<>();
Map<String, String> errors = new HashMap<String, String>();
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
Set<ConstraintViolation<Object>> validate = validator.validate(obj);
for (ConstraintViolation<Object> cv : validate) {
System.err.println(cv);
String key = cv.getPropertyPath().toString();
String msg = cv.getMessage();
if (errors.containsKey(key)) {
String last = errors.get(key);
errors.put(key, msg + "&" + last);
} else {
errors.put(key, msg);
}
}
errors.forEach((x,y)->{errorList.add(y);});
if(errorList.size()>0) {
logger.error("参数较验结果:{}",errorList.toString());
}
return errorList;
}
}
附:Controller中直接加上@Validated 或 @Valid方式
@RequestMapping("/test")
public ApiResp doSomething(@Validated @RequestBody TestRequest request) {
log.info("doSomething");
log.info(request.toString());
return ApiResp.retOK();
}

本文介绍如何创建自定义注解ByteCheck来校验byte类型的参数,包括定义注解、实现校验逻辑及在代码中应用的过程。
4009

被折叠的 条评论
为什么被折叠?



