JSR303自定義校驗註解,自定義註解校驗字串是否是JSON字串,可擴充套件

瀟灑郭發表於2020-10-09

目標:校驗字串是否是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<IsJson, String>

    前面為自定義註解,後面為要校驗的欄位的型別

  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;
}

相關文章