2013-10-03 16 views
6

Podczas korzystania z modułu schematu JSON Jacksona zamiast serializowania całego wykresu chciałbym przerwać za każdym razem, gdy napotkana jest jedna z moich klas modelu, i użyć nazwy klasy, aby wstawić $ ref dla innego schematu . Czy możesz poprowadzić mnie we właściwe miejsce w źródle jackson-module-jsonSchema, aby rozpocząć majsterkowanie?Jackson: generowanie schematów z odniesieniami

Oto niektóre kodu do zilustrowania problemu:

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

wyjściowa:

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

pożądany wynik:

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

Odpowiedz

0

Można spróbować użyć poniższy kod -

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

Ale twój oczekiwany wynik nie jest ważny, to nie powie $ ref, o ile nie podano schematu dla „zwierzęta” co najmniej raz.

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

Możesz użyć HyperSchemaFactoryWrapper zamiast SchemaFactoryWrapper. W ten sposób otrzymasz odniesienie do urn dla zagnieżdżonych podmiotów:

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

Nie działa dla mnie. Nadal generuje ReferenceSchema, a nie rozwiązany. –