Как изменить basePath для Springfox Swagger 2.0

Я запускаю службу, в которой пользовательский интерфейс Swagger доступен по адресу:

http://serviceURL/swagger-ui.html

Однако он находится за прокси, например:

http://proxyURL/serviceName

URL-адреса, сгенерированные пользовательским интерфейсом Swagger, выглядят так:

http://proxyURL/

вместо фактического URL с суффиксом serviceName. Насколько я понимаю, это означает манипулирование свойством basePath. Согласно документации:

Документация по API Swagger больше не может описывать операции на разных базовых путях. В версии 1.2 и ранее каждый ресурс мог иметь отдельный basePath. В 2.0 эквиваленты basePath (схемы + host + basePath) определены для всей спецификации.

@Api (basePath) устарел, и в нем не сказано, что и как использовать. Как сделать так, чтобы пути, сгенерированные Swagger, отображались правильно?

Я использую Spring Boo t, Springfox Swagger и аннотации.


person Martin Asenov    schedule 24.03.2016    source источник
comment
Удалось ли вам разрешить этот @Martin?   -  person Sampada    schedule 02.05.2016
comment
Я только что сделал Docket.pathMapping (serviceName), но я думаю, что это просто обходной путь для отсутствующей функциональности в Springfox, все еще ожидающий ответа   -  person Martin Asenov    schedule 03.05.2016
comment
Я ищу то же самое ..   -  person Barium Scoorge    schedule 18.07.2016
comment
Удалось ли вам решить эту проблему @MartinAsenov?   -  person red    schedule 07.05.2019


Ответы (2)


Использование Spring Fox 2.9.2, использование решения, упомянутого другими пользователями, не работает.

Что не работает:

  • Переопределение getApplicationBasePath в Docket pathProvider
  • Добавление server.servlet.context-path = / serviceName

Я не знаю, почему они не работают, но в моем проекте, использующем Springboot 2.1.6.RELEASE и Spring 5.1.8.RELEASE, два вышеуказанных решения игнорируются.

Итак, я пробую другой подход: https://github.com/springfox/springfox/issues/2817#issuecomment-517753110

Согласно комментарию к проблеме github, мне нужно переопределить класс сериализации Springfox json и слава богу, что это работает. Вот пример кода:

import io.swagger.models.Swagger;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import springfox.documentation.spring.web.json.JacksonModuleRegistrar;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.spring.web.json.JsonSerializer;

import java.util.Arrays;
import java.util.List;

import static io.github.jhipster.config.JHipsterConstants.SPRING_PROFILE_PRODUCTION;

@Component
@Primary
public class CustomBasePathSerialize extends JsonSerializer {

    // this injection is optional, if you don't need to
    // add basePath based on active profile, remove this.
    private final Environment env;

    public CustomBasePathSerialize(List<JacksonModuleRegistrar> modules,
                                   Environment env) {
        super(modules);
        this.env = env;
    }

    @Override
    public Json toJson(Object toSerialize) {
        if (toSerialize instanceof Swagger) {
            Swagger swagger = (Swagger) toSerialize;
            String basePath = "/serviceName";
            List<String> profiles = Arrays.asList(env.getActiveProfiles());

            // OPTIONAL: you can change basePath if you have difference path 
            // on any Spring profile, for example prod:
            if (profiles.contains(SPRING_PROFILE_PRODUCTION)) {
                basePath = "/";
            }
            swagger.basePath(basePath);
        }
        return super.toJson(toSerialize);
    }
}
person Eko Prasetyo    schedule 31.05.2020

Вы можете отредактировать SwaggerConfiguration следующим образом:

Позаботьтесь о замене package (который должен быть тот, который содержит ваши контроллеры REST), host и PATH, которые вам нужны

@Configuration
@EnableSwagger2
public class SwaggerConfiguration implements WebMvcConfigurer {

    public static final String PATH = "/serviceName";

    @Bean
    public Docket api() {
        final var package = "com.martin.rest";
        final var host = "localhost:8080";

        return new Docket(DocumentationType.SWAGGER_2)
                .host(host)
                .select()
                .apis(RequestHandlerSelectors.basePackage(package))
                .paths(PathSelectors.any())
                .build();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        final var apiDocs = "/v2/api-docs";
        final var configUi = "/swagger-resources/configuration/ui";
        final var configSecurity = "/swagger-resources/configuration/security";
        final var resources = "/swagger-resources";

        registry.addRedirectViewController(PATH + apiDocs, apiDocs).setKeepQueryParams(true);
        registry.addRedirectViewController(PATH + resources, resources);
        registry.addRedirectViewController(PATH + configUi, configUi);
        registry.addRedirectViewController(PATH + configSecurity, configSecurity);
        registry.addRedirectViewController(PATH, "/");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(PATH + "/**").addResourceLocations("classpath:/META-INF/resources/");
    }
}

Другое решение - изменить URL-адрес весенней загрузки context-path:

Отредактируйте файл залить application.properties:

server.servlet.context-path=/serviceName

Или, если у вас есть application.yml файл:

server:
  servlet:
    context-path: /serviceName

Предупреждение: Это изменит базовый путь всех ваших веб-служб, а не только Swagger

person veben    schedule 07.04.2020