У меня есть следующее весеннее сопоставление (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:
И это при выборе V2:
/v2/something/{id}




На самом деле вам может потребоваться реализовать собственный 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);
}
}
Единственный способ, которым это работает, - это @GetMapping({"/v1/something/{id}", "/v2/something/{id}"}), что очень неприятно, потому что это связано с большим количеством дублирования для будущих версий.
Обычно используется @GetMapping ("/ v1 / some") для одного метода, а @GetMapping ("/ v2 / some") - для совершенно другого. Мне кажется странным, что у вас будет единый фрагмент кода, обрабатывающий разные версии ваших API, включая другие версии. Это вообще необходимо для версии такой конечной точки?
Это правда, но для всех других методов, где нет изменений, я хочу, чтобы они работали, если вы запрашиваете /v1/something или /v2/something, я не хочу, чтобы клиенты получали 404 для 99% методов при запросе версии 2 (или версия 1)
Отлично, теперь работает нормально, благодаря вашему последнему обновлению вопроса, operationPath оказался /v{version}/something/{id}, поэтому нам нужно заменить v{version}.
Спасибо, но у меня все еще есть та же проблема: регулярное выражение, похоже, не подбирает правильную версию, удаляя регулярное выражение, у меня есть следующий
/v{version}/something/{id}, так что мне нужно swagger, чтобы заменить{version}на 1 или 2 в конфигурации, если это возможно