【问题标题】:How to convert joda dateTime to string in swagger如何将joda dateTime转换为swagger中的字符串
【发布时间】:2017-04-10 16:28:56
【问题描述】:

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

【问题讨论】:

    标签: java swagger swagger-ui swagger-2.0 objectmapper


    【解决方案1】:

    我不确定如何将您的自定义转换器添加到 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2021-03-31
      • 1970-01-01
      • 2011-04-16
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多