【问题标题】:Spring validate string value is a JSONSpring验证字符串值是一个JSON
【发布时间】:2020-03-30 21:44:00
【问题描述】:

我的配置文件中有一些值,应该是 JSON(将作为字符串加载)。

我希望 Spring 在注入之前验证该值确实是有效的 JSON,否则会抛出错误。

我已经阅读了存在的验证注释,例如 - @NotNull@Size@Min@Max@Email@NotEmpty 等。

有没有办法创建自定义验证器?

我想要一个尝试将字符串转换为 JSON 的验证器,如下例所示:How to convert jsonString to JSONObject in Java

【问题讨论】:

    标签: java json spring validation annotations


    【解决方案1】:

    这不是可用的验证注释提供的,因此您必须进行自定义实现。任务分为两个简单的步骤:

    1.给定的字符串是否为 JSON 格式

    有多个库能够解析(因此验证)字符串是否遵循 JSON 语法标准。让我们以我最喜欢的 GSON 为例(有many)。这取决于您当前使用的库:

    String string = "{\"foo\":\"bar\"}"
    JsonParser jsonParser = new JsonParser();
    try {
        jsonParser.parse(string);       // valid JSON
    } catch (JsonSyntaxException ex) { 
        /* exception handling */        // invalid JSON
    }
    

    2。自定义验证注解

    从提供启用验证的依赖项开始:

    • groupId:org.hibernate
    • artifactId:hibernate-validator

    创建一个用于验证的注解:

    @Documented
    @Constraint(validatedBy = JsonStringValidator.class)
    @Target({ ElementType.FIELD })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface JsonString {
        String message() default "The String is not in JSON format";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    

    ...以及通过注解处理验证的验证器:

    public class JsonStringValidator implements ConstraintValidator<JsonString, String> {
    
        @Override
        public void initialize(JsonString jsonString) { }
    
        @Override
        public boolean isValid(String string, ConstraintValidatorContext context) {
            // Use an implementation from step 1. A brief example:
            try {
                new JsonParser().parse(string);
                return true;                    // valid JSON, return true
            } catch (JsonSyntaxException ex) { 
                /* exception handling if needed */
            }
            return false;                       // invalid JSON, return false
        }
    }
    

    用法很简单:

    @JsonString
    private String expectedJsonString
    

    Baeldung's 详细描述了此实现。

    【讨论】:

    • 我已经按照你说的创建了注释和验证器,并尝试如下使用它:@JsonString @Value("${source.SomeJsonString}") private String someJsonString; 但似乎什么也没发生,验证器也没有被调用..
    • 很抱歉没有在问题中提及。链接中解决方案的问题在于,我在多个类中使用了我的 JSON 字符串(它被注入到一些不相关的类中),这样做会迫使我重复设置器......有吗还有其他可能的方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2012-08-03
    • 2017-11-27
    • 1970-01-01
    相关资源
    最近更新 更多