为什么springfox-swagger2用户界面告诉我"无法推断基本网址。"

时间:2017-11-22 00:38:58

标签: swagger-ui swagger-2.0

为什么springfox-swagger2用户界面告诉我Unable to infer base url.据我所知,我使用的是典型的Swagger spring-boot配置。

正如您在屏幕截图中看到的,支持UI的swagger-fox网址是 example.com/api 。注意:当我导航到https://localhost:9600/api/v2/api-docs/时,我得到一个标准的Spring Whitelabel Error Page。我怀疑这是问题的根源?我没有看到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内容。那么,我知道模态必须是相当新的吗?

如果此处没有足够的信息,请给我留言。

14 个答案:

答案 0 :(得分:17)

我能够通过添加带注释的SpringBootApplication来解决这个问题 - 正如Mark所建议的那样:

@EnableSwagger2

答案 1 :(得分:11)

对我来说,问题是Spring Security不允许访问swagger-ui所需的某些资源。解决方案是允许匿名访问以下路径:

  • /swagger-ui.html
  • / webjars / **
  • / v2 / **
  • / swagger-resources / **

就我而言,无需身份验证就可以访问这些资源。

答案 2 :(得分:2)

使用 SpringBootServletInitalizer 扩展您的主类。 它会很好。 请参考下文。

public class TestApp extends SpringBootServletInitializer{

    public static void main(String[] args) {

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

答案 3 :(得分:2)

事实证明,我的问题的解决方案是将struct CustomColor { let color : UIColor! let name : String! } 注释与Docket Bean一起移动到主Configuration类中。

我在Docket Bean的子包中创建了一个单独的类,我希望它能被Spring扫描并加载bean。也许我没有使用func dragItem(for indexPath: IndexPath) -> UIDragItem { let color = colorDetails[indexPath.row] let itemProvider = NSItemProvider(object: CustomColor ) let dragItem = UIDragItem(itemProvider: itemProvider) dragItem.localObject = color return dragItem } 注释那个docket类,或者问题可能是其他问题,但我得到了它的工作。

答案 4 :(得分:1)

在我的情况下,我在 WebSecurityConfig.java 中有此行:

.antMatchers("swagger-ui.html").permitAll()

当我添加此内容时:

.antMatchers("/swagger-resources/**").permitAll()

我的问题解决了。

答案 5 :(得分:1)

这对我有用。

@Override
    public void configure(WebSecurity web) throws Exception {
         web
        .ignoring()
        .antMatchers(
                "/swagger-resources/**",
                "/swagger-ui.html",
                "/v2/api-docs",
                "/webjars/**");
    }

确定根路径。

答案 6 :(得分:0)

对于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);
    }
}

答案 7 :(得分:0)

就我而言,我正在将 swagger2(2.9.2)应用程序的 springboot(2.1.2)部署为 tomcat8.5 中的war文件。 strong>并得到相同的错误。

后来我仅通过扩展此类文件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);
  }
}

This is the blog I referred how to deploy springboot application into tomcat

注意:我还没有配置swagger docket,只是使用了默认实现。

答案 8 :(得分:0)

我正在使用弹簧靴。

就我而言,我在包裹名称中输入了错误。 在我的项目中,基本包名称为

org.liferayasif.documents

因此我的配置文件应位于

org.liferayasif.documents.config

config->您可以输入任何名称。

但是错误地我在下面输入了不同的包装名称

org.liferayasif.config

在我的情况下,将配置文件放入正确的程序包名称中

org.liferayasif.documents.config

然后正常工作。

答案 9 :(得分:0)

我需要在Spring Security方法中添加对资源的匿名访问:     保护无效的configure(HttpSecurity http)

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

然后它开始工作。

答案 10 :(得分:0)

OAHH,对我而言,这是新事物。我为springfox-swagger2springfox-swagger-ui

有2个不同的版本

之前:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        **<version>2.6.1</version>**
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        **<version>2.9.2</version>**
    </dependency>

之后:

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        **<version>2.9.2</version>**
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        **<version>2.9.2</version>**
    </dependency>

这解决了我的问题。

答案 11 :(得分:0)

我遇到了同样的问题,但是(也许)我在pom.xml中版本不匹配

我的项目版本为:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.0.M5</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

然后,当我添加以下依赖项时,它开始起作用:

  <dependency>
        <groupId>org.springframework.plugin</groupId>
        <artifactId>spring-plugin-core</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>

发现于: https://github.com/springfox/springfox/issues/2932

答案 12 :(得分:0)

在Springboot应用程序的主文件中添加@EnableSwagger2批注

@SpringBootApplication
@EnableSwagger2
public class SampleApplication {

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

}

答案 13 :(得分:-1)

首先检查您的Java版本,它似乎无法与版本Java 11配合使用,尝试使用Java 8似乎没问题