2016-09-13 8 views
0

Я использую модуль схемы Jackson JSON версии 2.7.4 для создания схемы JSON для некоторых моих классов. В моих классах я использовал объект Joda DateTime. Схема для этого объекта генерируется, когда все его свойства взорваны (как показано ниже). Можно ли преобразовать это в нечто вроде DATE_TIME?Jackson JSON Генератор схемы для Joda date time

"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" 
     } 
    } 
    }, 

ответ

0

Я не знаю, является ли это правильным решением, но это то, что было предложено на другом веб-сайте, и это сработало для меня; следовательно, я отправляю это как ответ.

В модуле схемы Джексона существует понятие VisitorContext, которое может быть зарегистрировано классом ObjectMapper для генерации схемы. Согласно предложению, я обеспечил реализацию этого как:

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

Чтобы использовать это с ObjectMapper, я сделал это:

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

С этим я мог видеть, что моя схема имеет это для createdDate

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

Я не уверен, что в этом модуле есть какая-либо поддержка или Joda. Что вы можете сделать, это заменить созданную схему Joda самостоятельно. Что-то вроде этого:

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

Удаляет сгенерированную схему для Joda и добавляет формат string/date_time.