как сделать дружественный базовый URL-адрес для чванства 2.8.0

Я пытаюсь изменить базовый URL-адрес доступа к документации API. URL-адрес: http://localhost:8080/swagger-ui.html. Я хочу получить что-то вроде "http://localhost:8080/myapi/swagger-ui.html ".

Я использую Springfox 2.8.0 Swagger, Java 8, Spring Boot 2.0 Конфигурация swagger:

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket api(ServletContext servletContext) {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathProvider(new RelativePathProvider(servletContext) {
                    @Override
                    public String getApplicationBasePath() {
                        return "/myapi";
                    }
                })
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(Predicates.not(PathSelectors.regex("/error")))
                .build()
                .useDefaultResponseMessages(false);
    }
}

Поставщик пользовательского пути должен был помочь, но я все еще получаю доступ к документации api, используя url "http://localhost:8080/swagger-ui.html ". Если я использую URL-адрес "http://localhost:8080/myapi/swagger-ui.html ", я получаю ошибку 404. Посмотрите на скриншот ниже.

введите здесь описание изображения


person Julia Tyrer    schedule 19.04.2018    source источник
comment
Вам когда-нибудь удавалось исправить эту проблему, у меня такая же проблема   -  person mh377    schedule 26.07.2018


Ответы (5)


Для тех, кто использует Springfox Swagger 3.0.0

Вот рабочая конфигурация для изменения базового URL для документов:

springfox:
  documentation:
    swaggerUi:
      baseUrl: /documentation
    openApi:
      v3:
        path: /documentation/v3/api-docs
    swagger:
      v2:
        path: /documentation/v2/api-docs
person RomanMitasov    schedule 15.03.2021

https://github.com/springfox/springfox/issues/2250 - поскольку они сказал, что вы можете настроить перенаправление на свой собственный путь

person Donz    schedule 19.04.2018

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

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

@Configuration
@EnableSwagger2
public class SwaggerConfiguration implements WebMvcConfigurer {

    public static final String PATH = "/myapi";

    @Bean
    public Docket api() {
        final var package = "com.julia.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=/myapi

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

server:
  servlet:
    context-path: /myapi

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

person veben    schedule 07.04.2020

Я также столкнулся с этой проблемой и попробовал множество возможных решений, но ничего не помогло. В моем случае я не могу использовать перенаправление ресурсов, так как swagger должен быть доступен так же локально, как и в облаке Google, по пути соответствия / api-docs / **. и в облаке Google любое перенаправление ресурсов будет запрещено в моем случае. Все ресурсы также должны загружаться по этому пути

вот мое решение:
springfox-swagger2 и springfox-swagger-ui версии 2.9.2

@EnableSwagger2
@Configuration
public class SwaggerCommonConfig implements WebMvcConfigurer {
    public static final String PATH = "/api-docs";

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addRedirectViewController(PATH, "/");
    }

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

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

@RestController
@RequestMapping(SwaggerGatewayCommonConfig.PATH)
@RequiredArgsConstructor
public class SwaggerController {
    private final RestTemplate restTemplate;
    private final static String V2_API_DOCS = "/v2/api-docs";
    private final static String SWAGGER_RESOURCES_CONFIGURATION_UI = "/swagger-resources/configuration/ui";
    private final static String SWAGGER_RESOURCES_CONFIGURATION_SECURITY = "/swagger-resources/configuration/security";
    private final static String SWAGGER_RESOURCES = "/swagger-resources";
    private final static Pattern pattern = Pattern.compile("http[s]*://([^/]+)", Pattern.CASE_INSENSITIVE);

    @Value("${server.port}")
    private String port;

    @GetMapping(V2_API_DOCS)
    @SuppressWarnings("unchecked")
    public Map<String, Object> getV2ApiDocs(HttpServletRequest request) {
        Matcher matcher = pattern.matcher(request.getRequestURL().toString());
        matcher.find();

        Map<String, Object> resp = (Map<String, Object>) restTemplate.getForObject(toLocalSwaggerUrl(V2_API_DOCS), Map.class);
        //we have to replace standard host, to requested host. as swagger UI make api requests from this host
        resp.put("host", matcher.group(1));

        return resp;
    }

    @GetMapping(SWAGGER_RESOURCES_CONFIGURATION_UI)
    public Object getSwaggerResourcesConfigurationUi() {
        return restTemplate.getForObject(toLocalSwaggerUrl(SWAGGER_RESOURCES_CONFIGURATION_UI), Object.class);
    }

    @GetMapping(SWAGGER_RESOURCES_CONFIGURATION_SECURITY)
    public Object getSwaggerResourcesConfigurationSecurity() {
        return restTemplate.getForObject(toLocalSwaggerUrl(SWAGGER_RESOURCES_CONFIGURATION_SECURITY), Object.class);
    }

    @GetMapping(SWAGGER_RESOURCES)
    public Object getSwaggerResources() {
        return restTemplate.getForObject(toLocalSwaggerUrl(SWAGGER_RESOURCES), Object.class);
    }

    private String toLocalSwaggerUrl(String path) {
        return "http://localhost:" + port + path;
    }
}

Надеюсь, это сэкономит время, чтобы кто-нибудь тоже с этим сталкивался =) Удачи

person serhii    schedule 18.05.2020

Базовый URL-адрес доступа Swagger создается на основе вашего базового пути к приложению. Поэтому, если вы измените свой базовый путь к приложению, вы получите желаемое поведение. Но также все ваши API-интерфейсы будут изменены на этот путь. Вы можете найти здесь, как изменить его. Как установить базу url для отдыха в весенней загрузке?.

Вы также изменили способ вызова других API-интерфейсов из вашего приложения, а не изменили его базовый URL-адрес. Есть несколько уловок для изменения базового URL-адреса swagger без изменения базового пути приложения (перемещение вручную всех ресурсов swagger), но я не рекомендую это делать.

person Uta Alexandru    schedule 20.11.2019