Значение 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. Найдите прикрепленный список ProductAllenter image description here, представленный на прикрепленном изображении.

@ApiModel
public class ProductGetAllDTO {
    @ApiModelProperty(example="20")
    private String count;
    @ApiModelProperty(dataType="List", value = "rows")
    private List<ProductAll> rows;
}