Значение swagger @ApiModelProperty для свойства List <String>
У меня есть один класс, в котором есть одно свойство, которое является List<String>
public class MyClass {
....
@ApiModelProperty(position = 2)
private List<String> productIdentifiers;
....
}
Этот код генерирует значения примера следующим образом:
{
"customerId": "1001",
"productIdentifiers": [
"string"
],
"statuses": [
"NEW"
]
}
Приведенные здесь примеры значений недопустимы. Мои ожидаемые значения в примере должны быть такими:
{
"customerId": "1001",
"productIdentifiers": [
"PRD1",
"PRD2",
"PRD3"
],
"statuses": [
"NEW"
]
}
Я попытался передать пример атрибута следующим образом, но он не генерирует правильное значение:
@ApiModelProperty(position = 2, example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3" // Its not json array
@ApiModelProperty(position = 2, example = "[\"PRD1\", \"PRD2\", \"PRD3\"]")
// This generates -> "productIdentifiers": "[\"PRD1\", \"PRD2\", \"PRD3\"]" // Its too not json array
Есть ли способ, как я могу генерировать правильное значение примера для свойства List?
Обновить :
Я пробовал решения, предложенные @nullpointer и @Zeeshan Arif
@ApiModelProperty(position = 2, dataType="List", example = "PRD1, PRD2, PRD3")
private List<String> productIdentifiers;
//This generates -> '"productIdentifiers": "PRD1, PRD2, PRD3"'
Обновление 2:
Попробовал следующий подход, который не дал правильного ответа
@ApiModelProperty(position = 2, dataType="java.util.List<String>", example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3"
@ApiModelProperty(position = 2, dataType="String[]", example = "PRD1, PRD2, PRD3")
// This generates -> "productIdentifiers": "PRD1, PRD2, PRD3"
моя maven зависимость для баночки чванства:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.5.0</version>
<exclusions>
<exclusion>
<artifactId>mapstruct</artifactId>
<groupId>org.mapstruct</groupId>
</exclusion>
</exclusions>
</dependency>
Обновите билет github для этой проблемы
Ответы
Ответ 1
TL;DR: один из авторов Swagger-API работал над этой функцией, чтобы добавить ее в версию 3.0.0, но пока не уверен, когда она будет выпущена. На данный момент он находится в ветке feature/3.0.0-rc2 на GitHub Swagger-API.
Я работаю с Swagger уже почти два месяца, и в нашем проекте появились такие проблемы. Теперь я провел некоторое исследование и прочитал на страницах GitHub для Swagger-API, что эта функция просто не работает (пока).
Как описано здесь и [здесь была бы другая ссылка, но моя репутация недостаточно высока, чтобы разместить более 2 ссылок] эта функция запрашивалась несколько раз с августа 2015 года, но без особой удачи.
Теперь об этой проблеме на github Swagger-API один из авторов прокомментировал:
Это требует серьезного рефакторинга моделей, который находится в пути. 3 марта 2017
что приведет к более позднему комментарию:
Будет поддерживаться в поддержке 3.0.0, пожалуйста, смотрите ветку feature/3.0.0-rc2 для деталей. 27 июня 2017
И 9 августа 2017 года кто-то спросил, когда выйдет версия 3.0.0, и ответа не будет.
Итак, в заключение, поддержка примеров для массивов/списков была проработана и должна быть доступна в версии 3.0.0, но больше никаких новостей о том, когда это будет выпущено.
Ответ 2
Мне удалось заставить это работать, генерируя Список Строк.
В ApiModelProperty определите тип данных как список и напишите свой пример следующим образом:
example = "[AddLine1,AddLine2,AddLine3,AddLine4]"
Вот мой пример:
@ApiModelProperty(value = "Address", name = "addLines", dataType = "List",
example = "[AddLine1,AddLine2,AddLine3,AddLine4]")
Когда я отрисовываю свагерскую страницу, я получаю следующий вывод:
"addLines": [
"AddLine1",
"AddLine2",
"AddLine3",
"AddLine4"
],
Ответ 3
Вы просто используете обозначение Reflection
. Использование
@ApiModelProperty(dataType = "[Ljava.lang.String;")
отлично работает, но я не могу привести примеры.
Это результат:
{
"field": [
"string"
]
}
Ответ 4
Попробуйте инициализировать @ApiModelProperty
следующим образом:
public class MyClass {
....
@ApiModelProperty(
position = 2, datatype="List", example = "PRD1, PRD2, PRD3"
)
private List<String> productIdentifiers;
....
}
Ответ 5
Уродливое обходное решение до тех пор, пока мы не получим эту функцию должным образом, что дает примеры для списков только с одним элементом, но по крайней мере позволяет показывать что-то более полезное, чем просто "string"
, используя allowableValues
:
@ApiModelProperty(position = 2, allowableValues = "PRD1")
// This generates -> "productIdentifiers": ["PRD1"]
Ответ 6
Я изменил мой пример на код ниже, и это сработало.
public class MyClass {
....
@ApiModelProperty(
position = 2, datatype="List", example = "'[''{''PRD1''}','{''PRD2''}'']"
)
private List<String> productIdentifiers;
....
}
Ответ 7
Похоже, что это не поддерживается Swagger API. В то же время вы можете использовать этот плагин Springfox для создания примера с одним списком (один список значений) https://github.com/aaitmouloud/springfox-collection-example-plugin
Просто добавь это тебе pom.xml
<dependency>
<groupId>com.github.aaitmouloud</groupId>
<artifactId>springfox-collection-example-plugin</artifactId>
<version>2.9.2</version>
</dependency>
И импортируйте нужные классы в контекст Spring
@ComponentScan({"springfox.collection.example.plugins"})
Затем вы должны объявить пример единственного значения в вашем свойстве, и он будет преобразован плагином в пример одноэлементного списка (работает для всех классов java.util.Collection
)
@ApiModelProperty(value ="my property description", example = "2019-12-20T12:00:00")
@NotNull
private List<LocalDateTime> dates;
Отказ от ответственности: я являюсь автором этого плагина.
Ответ 8
Вот рабочий пример для списка объектов. Swagger версия 2.9.2. Все, что нужно, это чтобы dataType был определен как "Список", и это будет отображаться в документации swagger. Найдите прикрепленный список ProductAll
, представленный на прикрепленном изображении.
@ApiModel
public class ProductGetAllDTO {
@ApiModelProperty(example="20")
private String count;
@ApiModelProperty(dataType="List", value = "rows")
private List<ProductAll> rows;
}