2016-09-13 3 views
0

일부 클래스에 대해 JSON 스키마 생성을 위해 Jackson JSON 스키마 모듈 버전 2.7.4을 사용하고 있습니다. 수업에서는 Joda DateTime 개체를 사용했습니다. 이 개체의 스키마는 모든 속성이 분해되어 생성됩니다 (아래 그림 참조). 이것을 DATE_TIME과 같은 것으로 변환 할 수 있습니까?Jackson JSON Joda 날짜 시간 스키마 생성기

"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

이것이 올바른 해결책인지는 모르겠지만, 다른 웹 사이트에서 제안한 내용입니다. 따라서, 나는 이것을 답변으로 올리고있다.

Jackson 스키마 모듈에는 스키마 생성을 위해 ObjectMapper 클래스로 등록 할 수있는 VisitorContext이라는 개념이 있습니다. createdDate

에 대한 내 스키마이있다 볼 수 있었다 이것으로

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

:

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 이것을 사용하려면, 내가 이런 짓을 : 제안에 따라, 나는대로이의 구현을 제공

"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 스키마를 제거하고 문자열/date_time 형식을 추가합니다.