4

当我使用 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 实例,我会得到我想要的,但事实并非如此,显然有某种缓存,我对这些事情的了解还不够深,无法得出正确的结论。

谢谢!

4

4 回答 4

4

您可以覆盖 VisitorContext

SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
visitor.setVisitorContext(new VisitorContext(){
        @Override
        public String addSeenSchemaUri(JavaType aSeenSchema) {
            return javaTypeToUrn(aSeenSchema);
        }
    });
于 2016-11-07T21:47:25.287 回答
2

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

Field f = visitorContext.getClass().getDeclaredField("seenSchemas");
      f.setAccessible(true);
      f.set(visitorContext, dummyHashSet);
于 2014-10-20T08:29:11.510 回答
0

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

于 2014-10-16T08:59:58.533 回答
-1

我想你可以检查这一行:

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

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

myclass.class
于 2014-10-04T07:14:09.027 回答