Springfox Swagger 生成创建奇怪的模式
Springfox Swagger generation creates odd schema
我正在使用 Springfox-swagger 为我的 Spring Boot REST 服务生成一个 Swagger 页面。作为我序列化为 JSON 的一个 POJO 的一部分,我使用:
javax.money.MonetaryAmount
java.time.LocalDate
我看到的问题是,在 Swagger 中,响应的模型和模型 Shema 选项卡显示了这些字段的实现细节,即
LocalDate {
chronology (IsoChronology, optional),
dayOfMonth (integer, optional),
dayOfWeek (string, optional) = ['MONDAY' or 'TUESDAY' or 'WEDNESDAY' or 'THURSDAY' or 'FRIDAY' or 'SATURDAY' or 'SUNDAY'],
dayOfYear (integer, optional),
era (Era, optional),
leapYear (boolean, optional),
month (string, optional) = ['JANUARY' or 'FEBRUARY' or 'MARCH' or 'APRIL' or 'MAY' or 'JUNE' or 'JULY' or 'AUGUST' or 'SEPTEMBER' or 'OCTOBER' or 'NOVEMBER' or 'DECEMBER'],
monthValue (integer, optional),
year (integer, optional)
}
IsoChronology {
calendarType (string, optional),
id (string, optional)
}
Era {
value (integer, optional)
}
和
MonetaryAmount {
context (MonetaryContext, optional),
currency (CurrencyUnit, optional),
factory (MonetaryAmountFactory«MonetaryAmount», optional),
negative (boolean, optional),
negativeOrZero (boolean, optional),
number (NumberValue, optional),
positive (boolean, optional),
positiveOrZero (boolean, optional),
zero (boolean, optional)
}
MonetaryContext {
(...)
}
CurrencyUnit {
(...)
}
CurrencyContext {
(...)
}
MonetaryAmountFactory«MonetaryAmount» {
(...)
}
NumberValue {
(...)
}
如果重要的话,我正在使用 javax.money.MonetaryAmount
(JSR 354) 的 Moneta 1.1 实现。
现在,这对我想要的来说太冗长了,所以我实现了一个序列化程序,并且我的响应(和请求)按预期工作。然而,schemas 并未反映这一点。有没有办法在序列化请求后配置模式的格式?
我意识到这个问题有很多变化的部分,我创建了一个 proof of concept project 来充分展示这个问题。
根据 your example 看来您正在将序列化程序中的 MonetaryAmount
转换为 double
并将 LocalDate
转换为 String
。
因为 springfox 无法内省 jackson 机器(至少现在还不能:-)),我们需要告诉 SpringFox 您在序列化程序中正在做什么。为此,如摘要中 the documentation 中所述,您可以通过提供替代类型规则来提供提示。
docket
.directModelSubstitute(LocalDate.class, String.class)
.directModelSubstitute(MonetaryAmount.class, Double.class)
有三种方法可以做到这一点,通过 directModelSubstitutes
用于常规类型,genericModelSubstitutes
用于单一类型参数泛型类型,alternateTypeRules
用于更复杂的泛型类型用例。
我正在使用 Springfox-swagger 为我的 Spring Boot REST 服务生成一个 Swagger 页面。作为我序列化为 JSON 的一个 POJO 的一部分,我使用:
javax.money.MonetaryAmount
java.time.LocalDate
我看到的问题是,在 Swagger 中,响应的模型和模型 Shema 选项卡显示了这些字段的实现细节,即
LocalDate {
chronology (IsoChronology, optional),
dayOfMonth (integer, optional),
dayOfWeek (string, optional) = ['MONDAY' or 'TUESDAY' or 'WEDNESDAY' or 'THURSDAY' or 'FRIDAY' or 'SATURDAY' or 'SUNDAY'],
dayOfYear (integer, optional),
era (Era, optional),
leapYear (boolean, optional),
month (string, optional) = ['JANUARY' or 'FEBRUARY' or 'MARCH' or 'APRIL' or 'MAY' or 'JUNE' or 'JULY' or 'AUGUST' or 'SEPTEMBER' or 'OCTOBER' or 'NOVEMBER' or 'DECEMBER'],
monthValue (integer, optional),
year (integer, optional)
}
IsoChronology {
calendarType (string, optional),
id (string, optional)
}
Era {
value (integer, optional)
}
和
MonetaryAmount {
context (MonetaryContext, optional),
currency (CurrencyUnit, optional),
factory (MonetaryAmountFactory«MonetaryAmount», optional),
negative (boolean, optional),
negativeOrZero (boolean, optional),
number (NumberValue, optional),
positive (boolean, optional),
positiveOrZero (boolean, optional),
zero (boolean, optional)
}
MonetaryContext {
(...)
}
CurrencyUnit {
(...)
}
CurrencyContext {
(...)
}
MonetaryAmountFactory«MonetaryAmount» {
(...)
}
NumberValue {
(...)
}
如果重要的话,我正在使用 javax.money.MonetaryAmount
(JSR 354) 的 Moneta 1.1 实现。
现在,这对我想要的来说太冗长了,所以我实现了一个序列化程序,并且我的响应(和请求)按预期工作。然而,schemas 并未反映这一点。有没有办法在序列化请求后配置模式的格式?
我意识到这个问题有很多变化的部分,我创建了一个 proof of concept project 来充分展示这个问题。
根据 your example 看来您正在将序列化程序中的 MonetaryAmount
转换为 double
并将 LocalDate
转换为 String
。
因为 springfox 无法内省 jackson 机器(至少现在还不能:-)),我们需要告诉 SpringFox 您在序列化程序中正在做什么。为此,如摘要中 the documentation 中所述,您可以通过提供替代类型规则来提供提示。
docket
.directModelSubstitute(LocalDate.class, String.class)
.directModelSubstitute(MonetaryAmount.class, Double.class)
有三种方法可以做到这一点,通过 directModelSubstitutes
用于常规类型,genericModelSubstitutes
用于单一类型参数泛型类型,alternateTypeRules
用于更复杂的泛型类型用例。