2013-10-03 21 views
6

ジャクソンのJSONスキーマモジュールを使用する場合、完全なグラフをシリアル化するのではなく、自分のモデルクラスのいずれかが見つかるたびに停止し、クラス名を使用して別のスキーマ。 jackson-module-jsonSchemaソースの適切な場所に案内して、手直しを開始できますか?ここでJackson:参照付きスキーマの生成

は、問題を説明するためにいくつかのコードです:

public static class Zoo { 
    public String name; 
    public List<Animal> animals; 
} 

public static class Animal { 
    public String species; 
} 

public static void main(String[] args) throws Exception { 
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 

    ObjectMapper mapper = objectMapperFactory.getMapper(); 
    mapper.acceptJsonFormatVisitor(mapper.constructType(Zoo.class), visitor); 
    JsonSchema jsonSchema = visitor.finalSchema(); 

    System.out.println(mapper.writeValueAsString(jsonSchema)); 
} 

出力:

{ 
    "type" : "object", 
    "properties" : { 
    "animals" : { 
     "type" : "array", 
     "items" : { 
     "type" : "object", 
     "properties" : {   <---- Animal schema is inlined :-(
      "species" : { 
      "type" : "string" 
      } 
     } 
     } 
    }, 
    "name" : { 
     "type" : "string" 
    } 
    } 
} 

所望の出力:

{ 
    "type" : "object", 
    "properties" : { 
    "animals" : { 
     "type" : "array", 
     "items" : { 
     "$ref" : "#Animal"  <---- Reference to another schema :-) 
     } 
    }, 
    "name" : { 
     "type" : "string" 
    } 
    } 
} 

答えて

2

は、ここで問題を解決しcustom SchemaFactoryWrapperです。保証はありませんが、Jackson 2.4.3ではうまく機能しているようです。

更新:Jackson 2.5以降では、ずっと簡単です。これでcustom VisitorContextを指定できます。

0

あなたがしようとすると、次のコードを使用することができます - それは少なくとも一度は「動物」のスキーマを指定していない限り、

ObjectMapper MAPPER = new ObjectMapper(); 
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 

    JsonSchemaGenerator generator = new JsonSchemaGenerator(MAPPER); 

    JsonSchema jsonSchema = generator.generateSchema(MyBean.class); 

    System.out.println(MAPPER.writeValueAsString(jsonSchema)); 

をしかし、あなたの期待出力が有効ではありません、それは、$ REFを言うことはありません。

{ 
    "type": "object", 
    "id": "urn:jsonschema:com:tibco:tea:agent:Zoo", 
    "properties": { 
     "animals": { 
      "type": "array", 
      "items": { 
       "type": "object", 
       "id": "urn:jsonschema:com:tibco:tea:agent:Animal", 
       "properties": { 
        "species": { 
         "type": "string" 
        } 
       } 
      } 
     }, 
     "name": { 
      "type": "string" 
     } 
    } 
} 
2

SchemaFactoryWrapperの代わりにHyperSchemaFactoryWrapperを使用できます。このようにして、ネストされたエンティティのurn参照を取得します。

HyperSchemaFactoryWrapper visitor= new HyperSchemaFactoryWrapper(); 
ObjectMapper mapper = objectMapperFactory.getMapper(); 
mapper.acceptJsonFormatVisitor(mapper.constructType(Zoo.class), visitor); 
JsonSchema jsonSchema = visitor.finalSchema(); 

System.out.println(mapper.writeValueAsString(jsonSchema)); 
+0

私のためには機能しませんでした。解決済みではなくReferenceSchemaが生成されます。 –

関連する問題