共计 1817 个字符,预计需要花费 5 分钟才能阅读完成。
1.前言
最近和万达交互,发现他们居然也用Swagger,这可不行,我们用的Swagger必须要比他们的高级点,与众不同 。Swagger是一款优秀的文档工具不容置疑,使用的很广泛,但是精确到时分秒类型显示是有问题的,形如 2017-07-21T17:32:28Z这种,它是跟着RFC3339提案走的
也就是ISO8601时间格式,但是我们常用的形如yyyy-MM-dd HH:mm:ss这种,这就尴尬了,会给接入人员带来困扰。
2.改写规则
改写前,我们先阅读下Swagger的文档。首先查看下它支持的类型
发现date是string类型定义的,查看下string类型的描述,发现核心在于这个format
乍一看这不凉凉,这还要自定义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());
大功告成
3.小结
本文简述了基于Springfox如何调整Swagger日期格式的显示。
正文完