Swagger时间格式不符合预期,如何处理?

1,019次阅读
没有评论

共计 1817 个字符,预计需要花费 5 分钟才能阅读完成。

1.前言

最近和万达交互,发现他们居然也用Swagger,这可不行,我们用的Swagger必须要比他们的高级点,与众不同 Swagger时间格式不符合预期,如何处理? 。Swagger是一款优秀的文档工具不容置疑,使用的很广泛,但是精确到时分秒类型显示是有问题的,形如 2017-07-21T17:32:28Z这种,它是跟着RFC3339提案走的Swagger时间格式不符合预期,如何处理?
也就是ISO8601时间格式,但是我们常用的形如yyyy-MM-dd HH:mm:ss这种,这就尴尬了,会给接入人员带来困扰。

2.改写规则

改写前,我们先阅读下Swagger的文档。首先查看下它支持的类型
Swagger时间格式不符合预期,如何处理?
发现date是string类型定义的,查看下string类型的描述,发现核心在于这个format
Swagger时间格式不符合预期,如何处理?
乍一看这不凉凉,这还要自定义format类型,那改动可就大了。但是Swagger还有个example字段属性,我们要知道,我们最终就是要改写example的显示,既然不能从根源处理,那就尝试改写example。笔者用的是Springfox的实现,只需要改写2处,添加自定义实现LocalDateTimeSchema

public class LocalDateTimeSchema extends Schema<String> {
    private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    public LocalDateTimeSchema() {
        super("string", "date-time");
    }

    public LocalDateTimeSchema type(String type) {
        super.setType(type);
        return this;
    }

    public LocalDateTimeSchema format(String format) {
        super.setFormat(format);
        return this;
    }

    public LocalDateTimeSchema _default(Date defaults) {
        super.setDefault(defaults);
        return this;
    }

    @Override
    protected String cast(Object value) {
        if (!StringUtils.isEmpty(value)) {
            try {
                 if (value instanceof String){
                     return LocalDateTime.now().format(DateTimeFormatter.ofPattern(value.toString()));
                 }
            } catch (Exception e) {
                // ignored
            }
        }
        return LocalDateTime.now().format(dateTimeFormatter);
    }

    public LocalDateTimeSchema _enum(List<String> enums) {
        super.setEnum(enums);
        return this;
    }

    public LocalDateTimeSchema addEnumItem(String enumItem) {
        super.addEnumItemObject(enumItem);
        return this;
    }

    @Override
    public boolean equals(java.lang.Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        return super.equals(o);
    }

    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode());
    }

    @Override
    public String toString() {
        return "class LocalDateTimeSchema {\n" +
                "    " + toIndentedString(super.toString()) + "\n" +
                "}";
    }
}

改写默认的类型映射

SCALAR_SCHEMA_FACTORY.put(ScalarType.DATE_TIME, any -> new LocalDateTimeSchema());

大功告成

Swagger时间格式不符合预期,如何处理?

3.小结

本文简述了基于Springfox如何调整Swagger日期格式的显示。

Swagger时间格式不符合预期,如何处理?

正文完
 
mysteriousman
版权声明:本站原创文章,由 mysteriousman 2022-04-22发表,共计1817字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)