Почему пользовательский интерфейс 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()