JSR303自定义校验注解,自定义注解校验字符串是否是JSON字符串,可扩展

目标:校验字符串是否是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;
        }
    }
}

用法:

  1. implements ConstraintValidator

    前面为自定义注解,后面为要校验的字段的类型

  2. 实现这个接口后,主要有两个方法

    1. 初始化方法,public void initialize(IsJson constraintAnnotation) ,可以定义一些自定义属性,实现复杂校验。假设在 IsJson 注解中自定义一个成员,在此可以直接使用 constraintAnnotation.message() 获取值。
    2. 校验逻辑 public boolean isValid(String value, ConstraintValidatorContext context) ,这里的 value 就是参数值。

3 使用方式

@Data
public class Demo  {
     
    @IsJson(groups = {
     SaveGroup.class, UpdateGroup.class})
    @ApiModelProperty("JSON 字符串")
    private String json;
}

你可能感兴趣的:(java,json,java,spring,jsr)