2015-11-18 100 views
2

我正在將Springfox 2.2.2集成到我的Spring MVC項目中,但沒有生成api-docs,因爲我應該使用它。以下有關我的配置的一些信息。springfox 2.2.2沒有生成api文檔

我提供以下相關性(具有額外的庫作爲fasterxml,webjars,彈簧的正確版本被用於等一起)

<dependency> 
    <groupId>io.springfox</groupId> 
    <artifactId>springfox-swagger2</artifactId> 
    <version>2.2.2</version> 
</dependency> 

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

的Springfox被配置如下:

package com.exemplarypackage.config; 
@Configuration 
@EnableSwagger2 
@EnableWebMvc 
@ComponentScan("com.exemplarypackage.controller") 
public class SwaggerConfig extends WebMvcConfigurerAdapter{ 
    @Bean 
    public Docket api(){ 
     return new Docket(DocumentationType.SWAGGER_2) 
       .select() 
       .apis(RequestHandlerSelectors.any()) 
       .paths(PathSelectors.any()) 
       .build() 
       .apiInfo(apiInfo()); 
    } 

    private ApiInfo apiInfo() { 
     ApiInfo apiInfo = new ApiInfo(
       "My Project's REST API", 
       "This is a description of your API.", 
       "API TOS", 
       "url", 
       "[email protected]", 
       "API License", 
       "API License URL"); 
     return apiInfo; 
    } 

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

    } 

的示例性控制器如下所示:

package com.exemplarypackage.controller; 
@Api(value = "test class for springfox") 
@Controller 
public class TestController { 
    @ApiOperation(value = "Returns test details") 
    @ApiResponses(value = { 
     @ApiResponse(code = 200, message = "Successful retrieval", response = Test.class), 
     @ApiResponse(code = 404, message = "Test does not exist"), 
     @ApiResponse(code = 500, message = "Internal server error")} 
    ) 
    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public String test(Locale locale, Model model) { 
     logger.info("TEST"); 
     return "test"; 
    } 
} 

通過以上設置,當我執行url:localserver:8080/myApp/swagger-ui時,幾乎沒有任何內容顯示,但沒有錯誤消息。

然後,我在src/main/resources/META-INF中添加了我在spring-fox-swagger-ui-2.2.2.jar中找到的內容(我將它解壓並粘貼到給定文件夾中)。現在,當我到localserver:8080/myApp/swagger-ui時,所有綠色圖形都顯示出來,但沒有api文檔。我注意到在服務器日誌中,swagger-ui查找swagger-resources端點,但是它會得到404。當我瀏覽服務器日誌時,我發現沒有這樣的端點被創建爲:swagger-resources,v2/api-docs等等。但是,我注意到這些類被過濾以獲得swagger註釋......有一個springfox。在META-INF/resources/webjars/springfox-swagger-ui文件夾中包含了swagger-resorces端點的js文件 - 可能它應該切換到不同的名稱?

我不知道如何使它工作......我應該聲明那些終結點或應該自動創建?也許我只是想念一些小小的東西,但我在最後幾天與這個問題鬥爭,並不知道還應該配置什麼來使其工作。

+0

當你導航到'localserver:8080/myApp/v2/api-docs'時,你會得到什麼? –

+0

這是404答案:/ – gromajus

+0

你的servlet配置是什麼樣的? –

回答

0

@gromajus,請問您可以在您的典型控制器類中嘗試使用@RestController註釋而不是@Controller嗎?

+0

它沒有幫助 - 我改變了@ @控制器與'@ RestController',但沒有改變:/ – gromajus

+0

@gromajus,我也看到你嘗試獲得'swagger-ui'而不是'swagger-ui.html',但作爲@Dilip Krishnan提到你應該在'api-docs'端點上獲得一些json。您的應用程序是否構建時沒有任何警告並且沒有警告和錯誤地進行部署? – zubactik

+0

@gromajus,我最近遇到了和springfox一樣的問題。我不是一個經驗豐富的人。但是,除了控制器註釋之外,我還看到了我的配置和您的配置之間的差異。他們是:我有類的MVC配置和Swagger配置,而不是在你的例子中的單個配置類,'@配置'註釋我有最後一個,我不使用'@ Api',因爲我讀了某處(可能在java文檔),它已被棄用,我也看到一些錯誤在我與谷歌搜索導入包。你能否提供你的'import'語句(來自springfox pckg的'@ Api')? – zubactik

3

我設法解決了@zubactick的幫助。 目前,我有單獨的配置類爲springfox和mvc。所以,我的springfox的配置是這樣的:

package com.myPackage.config; 


import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

import springfox.documentation.builders.PathSelectors; 
import springfox.documentation.builders.RequestHandlerSelectors; 
import springfox.documentation.service.ApiInfo; 
import springfox.documentation.spi.DocumentationType; 
import springfox.documentation.spring.web.plugins.Docket; 
import springfox.documentation.swagger2.annotations.EnableSwagger2; 

@Configuration 
@EnableSwagger2 
public class SwaggerConfig{ 


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

    private ApiInfo apiInfo() { 
     ApiInfo apiInfo = new ApiInfo(
       "My Project's REST API", 
       "This is a description of your API.", 
       "API TOS", 
       "url", 
       "[email protected]", 
       "API License", 
       "API License URL"); 
     return apiInfo; 
    } 

} 

我的MVC的配置是這樣的:

package com.myPackage.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.Import; 
import org.springframework.web.servlet.ViewResolver; 
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.view.InternalResourceViewResolver; 

@Configuration 
@EnableWebMvc 
@Import({SwaggerConfig.class}) 
@ComponentScan("com.myPackage.controller") 
public class WebSpringConfig extends WebMvcConfigurerAdapter{ 

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

    @Bean 
    public ViewResolver configureViewResolver() { 
     InternalResourceViewResolver viewResolve = new InternalResourceViewResolver(); 
     viewResolve.setPrefix("/WEB-INF/views/"); 
     viewResolve.setSuffix(".jsp"); 

     return viewResolve; 
    } 

    @Override 
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 

} 

此外,在web.xml文件中指定了以下內容:

<servlet> 
     <servlet-name>appServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
     <param-name>contextClass</param-name> 
     <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> 
     </init-param> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>com.myPackage.config.WebSpringConfig</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

控制器可以與問題中提供的相同,但是通過上面的swagger配置,我聲明的包中的所有控制器都可以通過swagger進行掃描和記錄。

+0

謝謝,這只是幫助我弄清楚@Import({SwaggerConfig.class}),@ComponentScan({「com.myPackage.controller」,「com.myPackage.config」})或@SpringBootApplication (scanBasePackages =「com.myPackage.config」)不適用於springfox。 – vorburger