2016-09-13 17 views
0

我正在使用Jackson JSON模式模塊版本2.7.4爲我的一些類生成JSON模式。在我的課上,我已經使用了喬達DateTime的對象。該對象的模式是通過其所有屬性展開而生成的(如下所示)。有沒有可能將其轉換爲DATE_TIME之類的東西?Joda日期時間的Jackson JSON模式生成器

"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模式模塊中,有一個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生成的模式並添加字符串/ date_time格式。

相關問題