【问题标题】:Jackson: json schema references other schemas, can this be disabled?Jackson:json模式引用了其他模式,这个可以禁用吗?
【发布时间】:2014-10-03 19:30:24
【问题描述】:

当我使用 Jackson Json-Schema-Module 时,我的模式是使用相互指向的引用生成的。

考虑这个架构:

这是 POJO1 内部的一个属性对象

    "myObject" : {
     "type" : "object",
     "id": "urn:jsonschema:package:myObject"
     "properties": {
          "property1" : {
             "type" : "string"
         },
          "property2" : {
             "type" : "string"
         }
    }
 }

我在 POJO2 中有相同的属性对象,当两个模式都生成时,我在 POJO2 中得到以下内容:

  "myObject" : {
     "type" : "object",
     "$ref": "urn:jsonschema:package:myObject"
  }

但我希望 POJO2'a 模式中的这个属性与 POJO1 模式中的相同,我不想要引用。这可以禁用吗?或者有什么解决方法?

这是我使用的代码:

for (Class clazz : classes) {

    ObjectMapper m = new ObjectMapper();
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
    m.acceptJsonFormatVisitor(m.constructType(clazz), visitor);
    JsonSchema jsonSchema = visitor.finalSchema();
    m.write(new File("json/" + clazz.getSimpleName() + ".json"), jsonSchema);

}

起初我以为如果为每个架构构造使用不同的 ObjectMapper 实例,我会得到我想要的,但事实并非如此,显然有某种缓存,我对这些事情的了解还不够深入,无法正确结论。

谢谢!

【问题讨论】:

  • 我有完全相同的查询...
  • 我找到了答案。
  • Tatu 回复: Tatu Saloranta 昨天回复 感谢您的报告 -- 这是一个不幸的错误;虽然正确创建了 VisitorContext 的实例,但早期修复的一部分忽略了 Map 仍然是静态的事实。因此,2.4.4(和 2.5)将进行修复。

标签: java json jsonschema jackson-modules


【解决方案1】:

您可以覆盖 VisitorContext

SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
visitor.setVisitorContext(new VisitorContext(){
        @Override
        public String addSeenSchemaUri(JavaType aSeenSchema) {
            return javaTypeToUrn(aSeenSchema);
        }
    });

【讨论】:

    【解决方案2】:

    您可以简单地覆盖 hashset 并使用 java 反射设置它,如下所示:

    Field f = visitorContext.getClass().getDeclaredField("seenSchemas");
          f.setAccessible(true);
          f.set(visitorContext, dummyHashSet);
    

    【讨论】:

      【解决方案3】:

      有一个存储引用的类VisitorContext,它的方法是静态的,所以我通过修改这个类的源代码解决了这个问题。

      【讨论】:

      • 如果你能告诉我如何使用它会很棒,我已经从那个类扩展但无法使用新的 MyVisitorContext。
      • 我必须下载库的源代码,并在这个类本身内部进行更改。我没有找到其他方法。你不能覆盖静态方法。
      【解决方案4】:

      我认为你可以检查这一行:

      m.acceptJsonFormatVisitor(m.constructType(clazz), visitor);
      

      clazz 是什么类?我不确定,但是 clazz 您可以尝试以下操作:

      myclass.class
      

      【讨论】:

      • 我认为很明显我正在遍历一个类列表。
      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 2018-09-02
      • 2023-03-23
      • 2013-12-30
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多