2

Springfox 2.2.2 を Spring MVC プロジェクトに統合する作業を行っていますが、本来あるべきだと思われる API ドキュメントが生成されていません。私の構成に関するいくつかの情報の下に。

以下の依存関係を提供しました (fasterxml、webjars、Spring の正しいバージョンが使用されているなどの追加のライブラリと一緒に)。

    <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",
                "me@wherever.com", 
                "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 を実行すると、ほとんど何も表示されませんでしたが、エラー メッセージは表示されませんでした。

次に、spring-fox-swagger-ui-2.2.2.jar で見つけたコンテンツを src/main/resources/META-INF に追加しました (解凍して指定のフォルダーに貼り付けました)。ここで、localserver:8080/myApp/swagger-ui に移動すると、すべての緑色のグラフィックが表示されますが、API ドキュメントは表示されません。サーバーログで、swagger-ui が swagger-resources エンドポイントを探していることに気付きましたが、その後 404 になります。サーバーログを調べると、swagger-resources、v2/api-docs などのエンドポイントが作成されていないことがわかりました。ただし、クラスが swagger アノテーション用にフィルタリングされていることに気付きました... springfox があります。 swagger-resorces エンドポイントが含まれている META-INF/resources/webjars/springfox-swagger-ui フォルダー内の js ファイル - 別の名前に切り替える必要があるのではないでしょうか?

それを機能させる方法がわかりません...これらのエンドポイントを何らかの方法で宣言する必要がありますか、それとも自動的に作成する必要がありますか? 多分私は何か小さなものを見逃しているだけかもしれませんが、私はこの数日間問題と戦っていて、それを機能させるために他に何を設定する必要があるのか​​ わかりません。

4

2 に答える 2

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",
                "me@wherever.com", 
                "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 によって文書化されます。

于 2015-12-02T10:48:12.240 に答える