2016-09-13 1 views
0

Ich benutze Jackson JSON Schema Modul Version 2.7.4, um JSON-Schema für einige meiner Klassen zu generieren. In meinen Klassen habe ich Joda DateTime Objekt verwendet. Das Schema für dieses Objekt wird mit allen darin enthaltenen Eigenschaften generiert (wie unten gezeigt). Ist es möglich, dies in etwas wie DATE_TIME umzuwandeln?Jackson JSON Schema Generator für Joda Datum Zeit

"createdDate":{ 
    "type":"object", 
    "id":"urn:jsonschema:org:joda:time:DateTime", 
    "properties":{ 
     "weekOfWeekyear":{ 
      "type":"integer" 
     }, 
     "weekyear":{ 
      "type":"integer" 
     }, 
     "yearOfEra":{ 
      "type":"integer" 
     }, 
     "secondOfDay":{ 
      "type":"integer" 
     }, 
     "minuteOfDay":{ 
      "type":"integer" 
     }, 
     "yearOfCentury":{ 
      "type":"integer" 
     }, 
     "centuryOfEra":{ 
      "type":"integer" 
     }, 
     "millisOfDay":{ 
      "type":"integer" 
     }, 
     "monthOfYear":{ 
      "type":"integer" 
     }, 
     "hourOfDay":{ 
      "type":"integer" 
     }, 
     "minuteOfHour":{ 
      "type":"integer" 
     }, 
     "secondOfMinute":{ 
      "type":"integer" 
     }, 
     "millisOfSecond":{ 
      "type":"integer" 
     }, 
     "year":{ 
      "type":"integer" 
     }, 
     "dayOfMonth":{ 
      "type":"integer" 
     }, 
     "dayOfWeek":{ 
      "type":"integer" 
     }, 
     "era":{ 
      "type":"integer" 
     }, 
     "dayOfYear":{ 
      "type":"integer" 
     }, 
     "chronology":{ 
      "type":"object", 
      "id":"urn:jsonschema:org:joda:time:Chronology", 
      "properties":{ 
       "zone":{ 
       "type":"object", 
       "id":"urn:jsonschema:org:joda:time:DateTimeZone", 
       "properties":{ 
        "id":{ 
         "type":"string" 
        }, 
        "fixed":{ 
         "type":"boolean" 
        } 
       } 
       } 
      } 
     }, 
     "zone":{ 
      "type":"object", 
      "$ref":"urn:jsonschema:org:joda:time:DateTimeZone" 
     }, 
     "millis":{ 
      "type":"integer" 
     }, 
     "afterNow":{ 
      "type":"boolean" 
     }, 
     "beforeNow":{ 
      "type":"boolean" 
     }, 
     "equalNow":{ 
      "type":"boolean" 
     } 
    } 
    }, 

Antwort

0

Ich weiß nicht, ob dies die richtige Lösung ist, aber das ist, was auf einer anderen Website vorgeschlagen wurde, und das hat für mich funktioniert; Daher poste ich dies als Antwort.

In Jackson-Schema-Modul gibt es eine Vorstellung von VisitorContext, die mit ObjectMapper Klasse für Schema-Generierung registriert werden kann. Gemäß dem Vorschlag vorgesehen, ich eine Implementierung dieses als:

public static class VisitorContextWithoutSchemaInlining extends VisitorContext { 
    @Override 
    public String addSeenSchemaUri(final JavaType aSeenSchema) { 
    return getSeenSchemaUri(aSeenSchema); 
    } 

    @Override 
    public String getSeenSchemaUri(final JavaType aSeenSchema) { 
    return isEligibleForInlineSchema(aSeenSchema) ? javaTypeToUrn(aSeenSchema) : null; 
    } 

    private boolean isEligibleForInlineSchema(final JavaType type) { 
    return type.getRawClass() != String.class 
       && !isBoxedPrimitive(type) 
       && !type.isPrimitive() 
       && !type.isMapLikeType() 
       && !type.isCollectionLikeType() 
       && type.getRawClass() == DateTime.class 
       ; 
    } 

    private boolean isBoxedPrimitive(final JavaType type) { 
     return type.getRawClass() == Boolean.class 
      || type.getRawClass() == Byte.class 
      || type.getRawClass() == Long.class 
      || type.getRawClass() == Integer.class 
      || type.getRawClass() == Short.class 
      || type.getRawClass() == Float.class 
      || type.getRawClass() == Double.class 
      ; 
    } 
} 

dies mit ObjectMapper zu verwenden, ich habe dies:

final ObjectMapper mapper = new ObjectMapper(); 
final ObjectWriter objectWriter = mapper.writer(); 

final SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 
visitor.setVisitorContext(new VisitorContextWithoutSchemaInlining()); 

objectWriter.acceptJsonFormatVisitor(candidateClass, visitor); 
final JsonSchema jsonSchema = visitor.finalSchema(); 
final String schemaJsonString = objectWriter.forType(JsonSchema.class).writeValueAsString(jsonSchema); 

Damit konnte ich mein Schema hat dies für createdDate

sehen
"createdDate":{"type":"object","$ref":"urn:jsonschema:org:joda:time:DateTime"} 
0

Ich bin mir nicht sicher, ob es irgendwelche Unterstützung oder Joda in diesem Modul gibt. Sie können das generierte Joda-Schema durch Ihr eigenes ersetzen. So etwas wie dieses:

private void replaceDateTime(JsonSchema schema, Class<?> clazz) { 
     Field[] fields = ClazzFieldFinder.getAllFields(clazz); 
     for (Field field : fields) { 
      String fieldName = field.getName(); 
      if (field.getType().equals(DateTime.class)) { 
       schema.asObjectSchema().getProperties().remove(fieldName); 

       StringSchema stringSchemaDateTime = new StringSchema(); 
       stringSchemaDateTime.setFormat(JsonValueFormat.DATE_TIME); 
       schema.asObjectSchema().getProperties().put(fieldName, stringSchemaDateTime); 
      } 
     } 
    } 

Es entfernt das generierte Schema für Joda und fügt das Format string/date_time hinzu.