Swagger (OpenAPI): как указать пример строки, динамически сгенерированной из настраиваемого объекта?

Контекст

Скажем, у вас есть:

public class Dto {
  private String name;
  private String List<String> customs;

  // getters and setters...
}

а также

public class Custom {
  private String something;
  private String else;
  
  // getters and setters...
}

Ваш Spring MVC RestController получает список из Dto:

@PostMapping
public String create(@RequestBody List<Dto> dtos) {
  return myService.process(features);
}

Вход

Однако вы знаете, что клиентская служба, которая будет отправлять данные вашему контроллеру, отправит что-то вроде этого:

[
  {
    "name": "Bob",
    "customs": [
      "{\n        \"something\": \"yes\",\n        \"else\": \"no\"\n      }"
    ]
  }
]

Обратите внимание, что String представляет собой json-представление класса Custom. Пожалуйста, предположите, что это не может быть изменено на стороне клиента, и мы должны иметь дело с этим на стороне сервера.

Вопрос

Есть ли аннотация OpenAPI, которая позволила бы мне обозначить Custom как объект, который будет автоматически преобразован в String, который затем будет использоваться в качестве примера в пользовательском интерфейсе?

В качестве примера я говорю об этом автоматически сгенерированном json (пожалуйста, не обращайте внимания на фактические данные, показанные там, поскольку они не соответствуют представленной упрощенной проблеме):

Скриншот интерфейса Swagger для лучшей иллюстрации

Я прошу установить автоматический, потому что я бы предпочел не возвращаться к особенностям String, если мы в конечном итоге изменим свойства класса Custom (удалив something атрибут, например).

Мы используем эти зависимости Maven:

    <!-- Swagger / OpenAPI -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.4.1</version>
    </dependency>

person payne    schedule 14.09.2020    source источник
comment
Как вы используете springdoc и springfox вместе?   -  person SSK    schedule 15.09.2020
comment
@SSK, спасибо, что заставили меня это понять! Я удалил springfox в своем репо.   -  person payne    schedule 16.09.2020


Ответы (1)


Чтобы обозначить DTO как объект, который будет автоматически преобразован в строковое представление для пользовательского интерфейса документации openAPI, Swagger openApi предоставляет набор аннотаций, найденных в этой библиотеке:

<groupId>io.springfox</groupId>
<artifactId>swagger-annotations</artifactId>
<version>...</version>

Вы можете использовать их, чтобы решить вашу проблему, используя _ 2_ в вашем Dto.

При использовании этих аннотаций все изменения в ваших моделях автоматически фиксируются и обновляются в документации.

person Alex Ciocan    schedule 15.09.2020
comment
@ApiModel из более старой версии Swagger, но это действительно то, что я искал, поэтому я нашел эквивалент OpenAPI: @ArraySchema. Спасибо! - person payne; 16.09.2020