自定义校验--校验json长度

mysql8中支持json格式的字段,某些情况下使用很方便,但也带来一个问题,就是它的最大长度不能设置,最大支持4GB,如果有恶意程序保存一条4GB的数据进去,估计这张表就要卡死了,所以要加一个自定义校验,校验下json的长度,这里使用hibernate validator校验

添加注解 

这里加个JsonLength注解,message就是校验不通过返回的默认信息,value就是最大长度,默认1024

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = JsonLengthValidator.class)
public @interface JsonLength {
    String message() default "最大长度不能超过{value}";

    // 自定义的验证组
    Class<?>[] groups() default {}; // 这里可以指定一个或多个验证组类

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

    // 可以添加自定义参数
    int value() default 1024;
}

添加校验类

initialize方法是初始化的时候执行,可以在这里获取到配置的值,每个@JsonLength注解都会实例化一个对象,isValid方法是每次校验时调用,先把对象序列化成json字符串,然后比较下是否超过最大长度就行了

public class JsonLengthValidator implements ConstraintValidator<JsonLength, Object> {
    private int maxLength;

    @Override
    public void initialize(JsonLength constraintAnnotation) {
        maxLength = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        if (value == null) return true;
        // 序列化成字符串,判断长度
        String jsonStr = JsonUtils.serialize(value);
        return jsonStr.length() <= maxLength;
    }
}

最后只要在新增的controller方法里面加上@Validated注解就可以了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值