使用Spring Boot配置Swagger时获得意外结果

时间:2017-10-02 05:53:09

标签: spring spring-boot swagger swagger-ui

我对Swagger非常陌生,我开始使用Spring Boot构建非常简单的Web服务。

问题是,在我配置swagger之后,当我输入 localhost:8080 / swagger-ui.html 时,我在浏览器中看到以下屏幕,其中显示了一些奇怪的弹出消息,其中显示了"无法推断基本网址。这在使用动态servlet注册或API位于API网关后面时很常见。我确实知道这可能是一个重复的问题,但我根本不能解决这个问题。接下来,我发布了截图和完整的代码,我没有出错。请让我明白如果我出错了。

截屏:enter image description here

代码
SwaggerConfig.java

package com.test.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static springfox.documentation.builders.PathSelectors.regex;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .paths(regex("/greet.*"))
                .build();
    }
}

TestApplication.java

package com.test.config;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages="com.test.controllers") 
public class TestApplication {

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

TestController.java

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/greet")
public class TestController {

    @RequestMapping
        public String getGreeting() {
        return "Hello There";
    }
}

在上面的代码中, SwaggerConfig.java TestApplication.java 都属于同一个包,即 com.test.config TestController.java 属于 com.test.controllers

这是我所有的代码以及pom.xml中的两个依赖关系

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

6 个答案:

答案 0 :(得分:5)

我解决了在Application类上添加注释@EnableSwagger2的问题。

@SpringBootApplication
@EnableSwagger2 //this
public class Application {

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

}

答案 1 :(得分:5)

在将Spring-boot应用程序部署为war工件时,我遇到了同样的问题。在使用嵌入式tomcat运行应用程序时(作为一个独立的spring-boot应用程序),在将war文件部署到面向上述问题的远程tomcat时,它正常工作。

关于挖掘,我发现我错过了我的战争档案应用程序的Servlet初始化程序。

以下为我工作就像一个魅力。

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

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

答案 2 :(得分:1)

只需将这三个 URL 添加到 ResourceServerConfiguration 类“/swagger-ui”、“/swagger-ui.html”和“/swagger-resources/**”的配置方法中。它可以解决您的问题。

答案 3 :(得分:0)

嗯,尝试将.paths更改为.apis(RequestHandlerSelectors.basePackage(“你的控制器是com.demo.example.controller的包”))。build();如果它不起作用请告诉我。

答案 4 :(得分:0)

如果Swagger落后于任何身份验证,则需要在SpringBoot安全性中执行以下操作

http.authorizeRequests().antMatchers("/swagger-resources/**").permitAll().anyRequest().fullyAuthenticated();

然后您访问answer too

答案 5 :(得分:0)

在我看来,这个bean配置是一个问题制造者。

@Bean
public CsvMapper csvSerializerMapper() {
    stuff()
}

Spring使用它来初始化Spring的jackson objectMapper,该操作默默失败。 通过使用对象映射器添加bean对其进行了修复。

@Autowired
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    return builder.createXmlMapper(false).build();
}