Swagger несколько версий в пути

У меня есть следующее весеннее сопоставление (org.springframework.web.bind.annotation.GetMapping) в контроллере:

@GetMapping("/v{version:[1-2]}/something/{id}")

Я хочу иметь доступ к двум версиям api в чванстве. Это моя конфигурация чванства:

@Bean
public Docket v1(SwaggerProperties swaggerProperties) {
    return new Docket(DocumentationType.SWAGGER_2)
        .groupName("V1")
        .select()
            .paths(regex("/v1/.*")).build()     
}

@Bean
public Docket v2(SwaggerProperties swaggerProperties) {
    return new Docket(DocumentationType.SWAGGER_2)
        .groupName("V2")
        .select()
            .paths(regex("/v2/.*")).build()   
}

Это не работает, единственное, что я вижу в чванстве, когда удаляю селектор paths, это:

/v{version}/something/{id}

И я бы хотел увидеть:

/v1/something/{id}

При выборе группы V1 в селекторе групп swagger: Swagger несколько версий в пути И это при выборе V2:

/v2/something/{id}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
737
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле вам может потребоваться реализовать собственный PathProvider, чтобы развернуть путь сопоставления "/v{version:[1-2]}/something/{id}" в конкретный путь в Docket следующим образом:

//in Docket
.pathProvider(new ParticularVersionPathProvider("v1"))

...
class ParticularVersionPathProvider extends AbstractPathProvider {
   ...
   private String version;
   BasePathAwareRelativePathProvider(String version){
       this.version = version;
   }

   @Override
   public String getOperationPath(String operationPath) {
       //very schematically
       return operationPath.replace("v{version}",version);
   }
}

см. этот полный пример

Спасибо, но у меня все еще есть та же проблема: регулярное выражение, похоже, не подбирает правильную версию, удаляя регулярное выражение, у меня есть следующий /v{version}/something/{id}, так что мне нужно swagger, чтобы заменить {version} на 1 или 2 в конфигурации, если это возможно

pablo 23.08.2018 12:31

Единственный способ, которым это работает, - это @GetMapping({"/v1/something/{id}", "/v2/something/{id}"}), что очень неприятно, потому что это связано с большим количеством дублирования для будущих версий.

pablo 23.08.2018 13:07

Обычно используется @GetMapping ("/ v1 / some") для одного метода, а @GetMapping ("/ v2 / some") - для совершенно другого. Мне кажется странным, что у вас будет единый фрагмент кода, обрабатывающий разные версии ваших API, включая другие версии. Это вообще необходимо для версии такой конечной точки?

Kostiantyn 23.08.2018 13:13

Это правда, но для всех других методов, где нет изменений, я хочу, чтобы они работали, если вы запрашиваете /v1/something или /v2/something, я не хочу, чтобы клиенты получали 404 для 99% методов при запросе версии 2 (или версия 1)

pablo 23.08.2018 13:23

Отлично, теперь работает нормально, благодаря вашему последнему обновлению вопроса, operationPath оказался /v{version}/something/{id}, поэтому нам нужно заменить v{version}.

pablo 23.08.2018 16:26

Другие вопросы по теме