当我使用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实例,我会得到我想要的东西,但事实并非如此,显然存在某种缓存,我对这些东西的了解不够深入到右边结论
谢谢!
答案 0 :(得分:3)
You can override VisitorContext
SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
visitor.setVisitorContext(new VisitorContext(){
@Override
public String addSeenSchemaUri(JavaType aSeenSchema) {
return javaTypeToUrn(aSeenSchema);
}
});
答案 1 :(得分:2)
您可以简单地覆盖hashset并使用java反射设置它:
Field f = visitorContext.getClass().getDeclaredField("seenSchemas");
f.setAccessible(true);
f.set(visitorContext, dummyHashSet);
答案 2 :(得分:0)
我想你可以查一下这句话:
m.acceptJsonFormatVisitor(m.constructType(clazz), visitor);
什么类的课程是clazz?我不确定,但是你可以尝试类似的东西:
myclass.class
答案 3 :(得分:0)
有一个VisitorContext类存储引用,它的方法是静态的,所以我通过更改这个类的源代码解决了这个问题。