Как представить поля с универсальными типами, такими как List‹Something› в swagger-spring-mvc для swagger-codegen

Я использую swagger-spring-mvc 0.9.5, и в моих ответных данных есть такие поля:

@ApiModelProperty("Some description")
private List<Account> accounts;

Краткая версия вопроса: как я могу получить от этой аннотированной Java, например, Objective C через swagger-codegen?

Чванливый JSON, который генерируется при этом:

accounts: {
  description: "Some description",
  items: {
    type: "Account"
  },
  required: false,
  type: "List"
}

Мой коллега загружает это в swagger-codegen для создания классов Objective C, и он создает код, который не компилируется.

@property (nonatomic, strong) NSArray<Optional, NSArray> *accounts;

потому что NSArray (внутри < >) не является протоколом.

Файлы шаблонов чванства (усы) создают протокол для каждой модели. Когда этот протокол указан в массиве, он используется JSONModel для создания правильных моделей из данных внутри списка/массива. Таким образом, в этом случае ожидаемый результат

@property (nonatomic, strong) NSArray<Optional, MAAccount> *accounts;

Это создаст NSArray из MAAccount (где Account — тип объекта, а MA — префикс, который уже есть у swagger).

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

Итак, я попытался заставить swagger-spring-mvc использовать "array":

@ApiModelProperty(value = "Some description", dataType = "array")
private List<Account> accounts;

Но затем обнаружил, что dataType игнорируется в swagger-spring-mvc 0.9.5, и, судя по всему, в springfox 2.0 он игнорируется, если только это не полное имя класса Java.

Есть ли способ добиться этого, либо заставив swagger-spring-mvc/springfox использовать "array", либо любым другим способом?


person CupawnTae    schedule 07.05.2015    source источник
comment
Вы должны попытаться перейти на 2.x Springfox. Как минимум обновите свою версию до 1.0.2.   -  person Dilip Krishnan    schedule 08.05.2015
comment
Да, мы делаем это, но я не думаю, что это поможет, не так ли? В частности, я читал, что dataType будет игнорироваться, если это не полное имя класса.   -  person CupawnTae    schedule 08.05.2015
comment
Удалите аннотацию или, по крайней мере, удалите атрибут типа данных (если вам нужно сохранить описание), и он должен поступать правильно.   -  person Dilip Krishnan    schedule 08.05.2015
comment
О, также, чтобы быть дружественным к codegen, настройте Docket с forCodeGeneration true   -  person Dilip Krishnan    schedule 08.05.2015
comment
Нам нужно сохранить описание, поэтому нам нужна аннотация. Но будет ли он генерировать теперь "array" вместо "List", если мы опустим dataType? `Проверим флаг, спасибо (хотя мы хотим запустить swagger-ui из той же сборки, так что это звучит немного пугающе)   -  person CupawnTae    schedule 08.05.2015
comment
Да, будет :) о вопросе с swagger-ui, он будет абсолютно работать, только он не будет выглядеть как общий класс.   -  person Dilip Krishnan    schedule 08.05.2015
comment
Звучит отлично, попробую, спасибо   -  person CupawnTae    schedule 08.05.2015
comment
@DilipKrishnan Я забыл вернуться к этому вопросу - обновление до springfox 2.x решило эту проблему для меня. Хотите опубликовать предложение в качестве ответа, чтобы я мог его принять?   -  person CupawnTae    schedule 23.07.2015
comment
@DilipKrishnan Я опубликовал ответ, чтобы у вопроса был один - если вы сами опубликуете ответ в любой момент, я вместо этого приму его и удалю свой. Спасибо еще раз.   -  person CupawnTae    schedule 15.09.2015
comment
Спасибо, очень признателен! Я сделаю это.   -  person Dilip Krishnan    schedule 15.09.2015
comment
Наконец-то я добавил ответ! надеюсь, что это удовлетворительно!   -  person Dilip Krishnan    schedule 28.09.2015


Ответы (1)


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

В частности, я читал, что dataType будет игнорироваться, если это не полное имя класса.

Как предложил @CupawnTae, версия 2.x springfox поддерживает возможность рендеринга общего типы с удобными для генерации кода и независимыми от языка представлениями универсальных типов.

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

@Bean
public Docket docket() {
    return new Docket(DocumentationType.SWAGGER_2)
      ...
      .forCodeGeneration(true)
      ...;
}

Это заставит Springfox отображать общие типы, такие как List<String>

  • как ListOfString, когда forCodeGeneration установлено в true
  • как List«String», когда forCodeGeneration установлено в false
person Dilip Krishnan    schedule 27.09.2015
comment
Привет, я пробую это решение, но оно не сработало. Я хочу преобразовать переменную типа String в List‹String›. У меня есть dataType в ApiModelProperty как List‹String›, но он все равно будет отображать String. Кажется, он все еще игнорирует поле dataType... - person hao; 04.05.2017