java validator ip_自定义Java Validator

自定义Java Validator

在项目中,针对汉字的长度计算,数据库和java的计算方式不一致,需要重新处理下java 的 Validator,使其满足项目

建立自定义的 validator annotation

@Target({METHOD, FIELD})

@Retention(RUNTIME)

@Documented

@Constraint(validatedBy = SizeValidator.class) // 对应的验证class

public @interface DbSize {

String message() default "{javax.validation.constraints.Size.message}";

Class>[] groups() default {};

Class extends Payload>[] payload() default {};

/**

* @return size the element must be higher or equal to

*/

int min() default 0;

/**

* @return size the element must be lower or equal to

*/

int max() default Integer.MAX_VALUE;

}

创建验证的执行类

public class DbSizeValidator implements ConstraintValidator {

@Value("${db.charset:GBK}")

private String charset;

private DbSize size;

@Override

public void initialize(DbSize constraintAnnotation) {

this.size = constraintAnnotation;

}

/**

* Implements the validation logic.

* The state of {@code value} must not be altered.

*

* This method can be accessed concurrently, thread-safety must be ensured

* by the implementation.

*

* @param value object to validate

* @param context context in which the constraint is evaluated

* @return {@code false} if {@code value} does not pass the constraint

*/

@Override

public boolean isValid(String value, ConstraintValidatorContext context) {

if (value == null || "".equals(value)) {

return size.min() == 0 ? true : false;

}

int length = 0;

try {

length = value.getBytes(charset).length;

} catch (Exception e) {

try {

length = value.getBytes(Charset.forName("GBK")).length;

} catch (Exception e1){

// 如果失败,虚拟机就直接狗带了,不需要了

length = value.getBytes().length;

}

}

return (length > size.max() || length < size.min()) ? false : true;

}

}

测试

public class DbSizeValidatorTest {

@Test

public void validatorTest() {

ValidationModel model = new ValidationModel();

ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();

Validator validator = validatorFactory.getValidator();

Set> validate = validator.validate(model);

List messageList = new ArrayList<>();

for (ConstraintViolation constraintViolation : validate) {

messageList.add(constraintViolation.getMessage());

}

Assertions.assertEquals(true, messageList.stream().map(el -> "请使用类型".equals(el)).count() == 1);

messageList.stream().forEach(System.out::println);

}

@Data

private class ValidationModel {

@DbSize(max = 2, message = "请使用类型")

private String xdoSize = "错误";

@DbSize(max = 2, message = "xdoSize正确")

private String xdoSize1 = "对";

@DbSize(max = 5, message = "xdoSizeEn正确")

private String xdoSize2 = "对aB2";

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值