2013-10-03 22 views
6

Wenn ich Jacksons JSON-Schemamodul verwende, möchte ich statt des gesamten Graphen immer anhalten, wenn eine meiner Modellklassen gefunden wird, und den Klassennamen verwenden, um ein $ ref für ein anderes Schema einzufügen . Kannst du mich an die richtige Stelle in der jackson-module-jsonSchema-Quelle führen, um mit dem Basteln zu beginnen?Jackson: Generiere Schemas mit Referenzen

Hier einige Code, um das Problem zu veranschaulichen:

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)); 
} 

Ausgang:

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

SOLL-Ausgang:

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

Antwort

0

Sie können versuchen, und die Verwendung folgende Code -

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)); 

Aber Ihre erwartete Ausgabe nicht gültig ist, wird es $ ref nicht sagen, es sei denn es das Schema für „Tiere“ mindestens einmal festgelegt hat.

{ 
    "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

Sie können den HyperSchemaFactoryWrapper anstelle von SchemaFactoryWrapper verwenden. Auf diese Weise erhalten Sie eine Urn-Referenz für verschachtelte Entitäten:

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

Hat nicht für mich gearbeitet. Generiert immer noch ReferenceSchema anstelle von aufgelöstem. –