如何大摇大摆地将joda dateTime转换为字符串

How to convert joda dateTime to string in swagger

在 swagger-core 版本 1.3.x 中,我们能够通过使用此代码来控制 DateTime 的呈现,正如此 link 中提到的:

import com.wordnik.swagger.converter.*;

String jsonString = "{" +
"  \"id\": \"Date\"," +
"  \"properties\": {" +
"    \"value\": {" +
"      \"required\": true," +
"      \"description\": \"Date in ISO-8601 format\"," +
"      \"notes\": \"Add any notes you like here\"," +
"      \"type\": \"string\"," +
"      \"format\": \"date-time\"" +
"    }" +
"  }" +
"}";
OverrideConverter converter = new OverrideConverter();
converter.add("java.util.Date", jsonString);

ModelConverters.addConverter(converter, true);

但是这个解决方案在 swagger 2.0 中不起作用,因为我在 swagger 2.0 中找不到 OverrideConvertor。

目前我的代码中的日期时间呈现如下:

LocalDateTime {
chronology (Chronology, optional),
weekOfWeekyear (integer, optional),
weekyear (integer, optional),
monthOfYear (integer, optional),
yearOfEra (integer, optional),
yearOfCentury (integer, optional),
centuryOfEra (integer, optional),
millisOfSecond (integer, optional),
millisOfDay (integer, optional),
secondOfMinute (integer, optional),
minuteOfHour (integer, optional),
hourOfDay (integer, optional),
year (integer, optional),
dayOfMonth (integer, optional),
dayOfWeek (integer, optional),
era (integer, optional),
dayOfYear (integer, optional),
fields (Array[DateTimeField], optional),
fieldTypes (Array[DateTimeFieldType], optional),
values (Array[integer], optional)

我不确定如何将自定义转换器添加到 swagger 1.5。但这些是您的用例的解决方法:

您可以创建一个 Model 并在生成的 swagger 对象中替换它,然后再将其转换为 Json。

ModelImpl m = new ModelImpl()
          .description("LocalDateTime in ISO format")
          .format("ISO DateTime")
          .name("DateTime")
          .type("string");
Response response = getListingJsonResponse(app, context, sc, headers, uriInfo);
Swagger swagger = (Swagger) response.getEntity();
swagger.getDefinitions().put("LocalDateTime", m);

这将用字符串类型模型替换 LocalDateTime 的定义。

另一种方法是遍历定义,在任何看到 LocalDateTime 引用类型的地方,将其替换为字符串类型:

Map<String, Model> definitions = swagger.getDefinitions();
  for(Map.Entry<String, Model> e : definitions.entrySet()){
    Map<String, Property> propertyMap = e.getValue().getProperties();
    for(String key : propertyMap.keySet()){
      Property value = propertyMap.get(key);
      if(value.getType().equals("ref") && ((RefProperty) value).getSimpleRef().equals("LocalDateTime")){
        propertyMap.put(key, new StringProperty("LocalDateTime in ISO format")
                .example("dd-mm-yyyy")
                .pattern("pattern")
                .description("ISO format string"));
      }
    }
  }

到目前为止,我还没有发现任何其他更简洁的方法来实现这一点。

更新

Swagger 具有 DateTime 而不是 LocalDateTime 的映射。因此,如果适合您,您还可以考虑将类型移至 DateTime