如何向Jackson模式添加自定义注释

时间:2014-04-01 11:30:25

标签: json jackson jsonschema

我有一节课,说:

class Data {
    public int value;
};

我希望生成json模式使用jackson-schema模块,其中包含有效的数据字段范围,例如:

class Data {
    @JsonProperties(min = 1)
    @JsonProperties(max = 100)
    public int value;
};

但是我在jackson-schema的wiki中搜索并且它不支持这个,是否有一些例子来自己制作自定义注释?感谢

3 个答案:

答案 0 :(得分:2)

有一种方法可以在jackson架构中包含自定义注释,但是您需要创建如下几个类,我使用它来添加我的自定义标题属性:

  1. 创建自己的SchemaFactoryWrapper

    public static class YourselfSchemaFactoryWrapper extends SchemaFactoryWrapper{
        private static class YourselfSchemaFactoryWrapperFactory extends WrapperFactory {
            @Override
            public SchemaFactoryWrapper getWrapper(SerializerProvider p) {
                SchemaFactoryWrapper wrapper = new YourselfSchemaFactoryWrapper();
                if (p != null) {
                    wrapper.setProvider(p);
                }
                return wrapper;
            };
    
            @Override
            public SchemaFactoryWrapper getWrapper(SerializerProvider p, VisitorContext rvc) {
                SchemaFactoryWrapper wrapper = new YourselfSchemaFactoryWrapper();
                if (p != null) {
                    wrapper.setProvider(p);
                }
                wrapper.setVisitorContext(rvc);
                return wrapper;
            }
        };
    
        public YourselfSchemaFactoryWrapper() {
            super(new YourselfSchemaFactoryWrapperFactory());
            schemaProvider = new YourselfJsonSchemaFactory();
        }
    }
    
  2. 创建自己的JsonSchemaFactory 您可以根据需要覆盖此类中的JsonSchemaFactory函数。对于这种情况,我只想覆盖字符串模式。

    public class YourselfJsonSchemaFactory extends JsonSchemaFactory{
        @Override
        public StringSchema stringSchema() {
            return new YourselfStringSchema();
        }
    }
    
  3. 创建自己的StringSchema

    public class YourselfStringSchema extends StringSchema{
        @Override
        public void enrichWithBeanProperty(BeanProperty beanProperty) {
            super.enrichWithBeanProperty(beanProperty);
            JsonPropertyTitle title = beanProperty.getAnnotation(JsonPropertyTitle.class);
            if(title != null) this.setTitle(title.value());
        }
    }
    
  4. 然后定义您自己的注释

    @Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @JacksonAnnotation
    public @interface JsonPropertyTitle
    {
        String value() default "";
    }
    
  5. 最后,您可以将此注释用于模型

    public class DataModal{
        @JsonPropertyTitle("My Custom Title")
        private str;
    }
    

答案 1 :(得分:1)

您可以对此(javax.validation.*)使用Java验证API。

  

javax.validation.constraints.Size

@Size(min = 1, max = 100, message = "error message")
private String text;

答案 2 :(得分:0)

这样做的一个项目是JJSchema。 JSON Schea的杰克逊模块目前没有这种精细控制。