❝目标:校验字符串是否是JSON字符串
❞
1 自定义校验注解
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
/**
* description: 自定义校验注解,需指定校验器,可以指定多个,校验字符串是否是json
*
* @author xiaosaguo
* @date 2020/09/21
*/
@Documented
@Constraint(validatedBy = {IsJsonConstraintValidator.class})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface IsJson {
String message() default "不是一个合法的JSON字符串";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2 自定义注解校验器
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.IOException;
/**
* description: 自定义注解校验器,需指定注解和校验类型,校验是否是 JSON 格式
*
* @author xiaosaguo
* @date 2020/09/21 20:57
*/
public class IsJsonConstraintValidator implements ConstraintValidator<IsJson, String> {
public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Override
public void initialize(IsJson constraintAnnotation) {
// 新版本可以不用实现这个方法
}
/**
* description: 校验逻辑,是否校验成功,空值配合 @Null 或 @NotNull、@NotEmpty 校验
*
* @param value 被校验的值
* @param context 上下文环境信息
* @return boolean 校验结果
* @author xiaosaguo
* @date 2020/06/10 20:47
*/
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return StringUtils.isEmpty(value) || isJsonValid(value);
}
public static boolean isJsonValid(String jsonInString) {
try {
OBJECT_MAPPER.readTree(jsonInString);
return true;
} catch (IOException e) {
return false;
}
}
}
用法:
implements ConstraintValidator<IsJson, String>
前面为自定义注解,后面为要校验的字段的类型
实现这个接口后,主要有两个方法
- 初始化方法,public void initialize(IsJson constraintAnnotation) ,可以定义一些自定义属性,实现复杂校验。假设在 IsJson 注解中自定义一个成员,在此可以直接使用 constraintAnnotation.message() 获取值。
- 校验逻辑 public boolean isValid(String value, ConstraintValidatorContext context) ,这里的 value 就是参数值。
3 使用方式
@Data
public class Demo {
@IsJson(groups = {SaveGroup.class, UpdateGroup.class})
@ApiModelProperty("JSON 字符串")
private String json;
}