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注解就可以了