Почему пользовательский интерфейс Springfox-swagger2 говорит мне "Невозможно вывести базовый url".

Почему пользовательский интерфейс springfox-swagger2 сообщает мне, что невозможно Unable to infer base url. Насколько я знаю, я использую типичную конфигурацию Swagger с пружинной загрузкой.

Как вы можете видеть на скриншоте, URL-адрес swagger-fox, поддерживающий пользовательский интерфейс, - example.com/api. ПРИМЕЧАНИЕ. Я получаю стандартную Whitelabel Error Page Spring Whitelabel Error Page при переходе по адресу: https://localhost: 9600/api/v2/api-docs/. Я подозреваю, что это корень проблемы? Я не вижу ошибок в том, что Spring не загрузил springfox-swagger2 и поэтому я не знаю, почему это не работает.

enter image description here

Мой конфиг выглядит примерно так (и я пробовал всевозможные варианты этого конфига, от поиска в сети за советом):

@EnableSwagger2
@EnableWebMvc
@ComponentScan(basePackages = {"com.company.project"})
public class SwaggerConfig
{
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud")))
                .apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.data.rest.webmvc")))
                .paths(PathSelectors.any())
                .build();
    }
}

А также

<!-- to generate /swagger-ui.html -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.7.0</version>
</dependency>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.7.0</version>
</dependency>

ПРИМЕЧАНИЕ: Интересно, что когда я пробую версию 2.6.0, я не получаю модальное всплывающее окно, но мой Swagger UI показывает содержимое 0 api. Итак, я знаю, что модал должен быть довольно новым?

Если здесь недостаточно информации, оставьте мне комментарий.

Ответ 1

Оказывается, решение моей проблемы состояло в том, чтобы переместить аннотацию @EnableSwagger2 в основной класс конфигурации вместе с Docket Bean.

Я создал отдельный класс в субпакте с Docket Bean, и я ожидал, что он будет проверен на Spring и загрузит Bean. Возможно, мне не удалось аннотировать этот класс docket с помощью @Component, или, может быть, проблема была чем-то другим, но я получил ее работу.

Ответ 2

Мне удалось решить проблему, добавив SpringBootApplication с аннотацией - как предположил Марк:

@EnableSwagger2

Ответ 3

Для меня проблема была в том, что Spring Security не разрешал доступ к некоторым ресурсам, необходимым для swagger-ui. Решение состояло в том, чтобы разрешить анонимный доступ к следующим путям:

  • /swagger-ui.html
  • /Webjars/**
  • /V2/**
  • /Чванство-ресурсы/**

В моем случае это нормально, что эти ресурсы могут быть доступны без аутентификации.

Ответ 4

Просто выпустите основной класс с помощью SpringBootServletInitalizer. Будет хорошо работать. Возьмите ссылку, как показано ниже.

public class TestApp extends SpringBootServletInitializer{

    public static void main(String[] args) {

       SpringApplication.run(TestApp.class, args);
   }
}

Ответ 5

Для Spring 2 используйте аннотацию @SpringBootApplication и расширяйте приложение класса из SpringBootServletInitializer, затем переопределяйте метод SpringApplicationBuilder

@SpringBootApplication
public class TestApp extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(TestApp.class);
    }


    public static void main(String[] args) {
        SpringApplication.run(TestApp.class, args);
    }
}

Ответ 6

В моем случае я развертываю нашу Springboot (2.1.2) с приложением swagger2 (2.9.2) как файл war в tomcat8.5 и получаю ту же ошибку.

Позже я смог исправить это, просто расширив этот файл класса. AppConfig extends SpringBootServletInitializer

Мой полный файл AppConfig

package org.mydomain

import java.net.URL;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

@SpringBootApplication(scanBasePackages = "org.mydomain")
@EntityScan({"org.mydomain.entity"})
@EnableJpaRepositories({"org.mydomain.repository"})
@EnableSwagger2
@EnableScheduling
public class AppConfig extends SpringBootServletInitializer {

  // We can optionally have spring boot way of starting main method
  public static void main(String[] args) {
     SpringApplication.run(AppConfig.class, args);
  }
}

В этом блоге я упоминал, как развернуть приложение Springboot в Tomcat

Примечание: я не настроил swagger docket, просто использовал реализацию по умолчанию.

Ответ 7

Я использую весеннюю загрузку.

В моем случае я допустил ошибку в названии пакета. в моем проекте имя базового пакета

org.liferayasif.documents

так что мой файл конфигурации должен быть внутри

org.liferayasif.documents.config

config → вы можете дать любое имя.

но по ошибке я поставил другое название пакета ниже

org.liferayasif.config

как только я поместил файл конфигурации в правильное имя пакета в моем случае

org.liferayasif.documents.config

тогда это работало правильно.

Ответ 8

Мне нужно было добавить анонимный доступ к ресурсам в методе Spring Security:   защищенная конфигурация void (HttpSecurity http)

.antMatchers("/api/**", "/swagger-ui.html", "/webjars/**", "/v2/**", "/swagger-resources/**").anonymous()

И тогда это начинает работать.

Ответ 9

Это единственный способ, который отлично работает со мной:

Мне нужно было добавить анонимный доступ к ресурсам в методе Spring Security: защищенный void configure (HttpSecurity http)

.antMatchers("/api/", "/swagger-ui.html", "/webjars/", "/v2/", "/swagger-resources/").anonymous()