Генерация Springfox Swagger создает странную схему

Я использую Springfox-swagger для создания страницы Swagger для моей службы Spring Boot REST. Как часть одного из моих POJO, которые я сериализую в JSON, я использую:

  • javax.money.MonetaryAmount
  • java.time.LocalDate

Проблема, которую я вижу, заключается в том, что в Swagger вкладки Model и Model 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 {
  (...)
}

Я использую реализацию Moneta 1.1 javax.money.MonetaryAmount (JSR 354), если это имеет значение.

Теперь это слишком многословно для того, что я хочу, поэтому я реализовал сериализатор, и мой ответ (и запросы) работают, как и ожидалось. Однако схемы этого не отражают. Есть ли способ настроить формат схем после сериализации запросов?

Поскольку я понимаю, что в этой проблеме довольно много движущихся частей, я создал проект проверки концепции чтобы показать проблему во всей красе.


person kinbiko    schedule 16.01.2017    source источник


Ответы (1)


На основе ваш пример выглядит так, как будто вы конвертируете MonetaryAmount в double и LocalDate в String в своих сериализаторах.

Поскольку Springfox не может самостоятельно исследовать механизм Джексона (по крайней мере, пока :-)), нам нужно сообщить SpringFox, что вы делаете в своих сериализаторах. Для этого, как описано в документация в вашей папке, вы можете дать подсказку, предоставив правила альтернативного типа.

docket
      .directModelSubstitute(LocalDate.class, String.class)
      .directModelSubstitute(MonetaryAmount.class, Double.class)

Есть три способа сделать это: directModelSubstitutes для обычных типов, genericModelSubstitutes для универсальных типов аргументов с одним типом и alternateTypeRules для более сложных вариантов использования универсальных типов.

person Dilip Krishnan    schedule 16.01.2017
comment
Большое спасибо. Есть ли способ сделать более локализованную замену? т.е. LocalDate -> String в одном месте, а LocalDate -> Long в другом? - person kinbiko; 17.01.2017
comment
Нашел ответ: вы можете использовать @ApiModelProperty(dataType = "com.qualified.ReplacedWith") для геттеров POJO. - person kinbiko; 18.01.2017
comment
Извините, что не ответил раньше. Вот что я бы посоветовал ???????? - person Dilip Krishnan; 18.01.2017