Spring swagger2 генерирует недопустимый spe c при замене типа значения карты - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующий объект ответа.

data class SomeResponse(
    val progressUri: URI,
    val productUrls: Map<SomeEnumKey, URI>
) {

Ответ, который создает Джексон:

{
  "progressUri": "http://blah.com",
  "productUrls": {
    "prod1": "http://prod1.blah.com"
  }
}

Итак, чтобы получить чванство, сделайте c для соответствия ответу, Мне нужно преобразовать URI в String. Моя конфигурация swagger определяется следующим образом:

@Bean
fun createDocket(
        @Value("\${info.app.name}") applicationName: String,
        @Value("\${info.app.version}") applicationVersion: String
): Docket {
        return Docket(DocumentationType.SWAGGER_2)
                .apiInfo(ApiInfoBuilder()
                        .title(applicationName)
                        .version(applicationVersion)
                        .build()
                )
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(Api::class.java))
                .paths(PathSelectors.any())
                .build()
                .directModelSubstitute(URI::class.java, String::class.java)
    }

Кажется, это создает правильное сопоставление для progressUri, но не productUrls. Файл swagger, сгенерированный для указанного выше класса: -

"SomeResponse": {
  "type": "object",
  "required": [
    "productUrls",
    "progressUri"
  ],
  "properties": {
    "productUrls": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/definitions/URI" # booo!
      }
    },
    "progressUri": {
      "type": "string" # yay!
    }
  },
  "title": "SomeResponse"
}

В частности, он не только не преобразует тип карты из URI в String, но и не может сгенерировать "$ ref": " # / definitions / URI " в любом месте документа. Посещение / swagger-ui. html и проверка этого объекта дает следующую ошибку: -

Resolver error at paths./api/blah.post.responses.200.schema.properties.productUrls.additionalProperties.$ref
Could not resolve reference because of: Could not resolve pointer: /definitions/URI does not exist in document

Как я могу определить замену для объекта, которая также применяется, когда этот объект общий c тип карты / списка et c?

В конечном итоге я могу обновить объекты ответа, чтобы просто вернуть String, но я хотел бы иметь возможность решить эту проблему с помощью конфигурации.

...