web-dev-qa-db-ja.com

SpringBootでSwaggerを構成しているときに予期しない結果が発生する

私はSwaggerを初めて使用し、SpringBootを使用して構築した非常に単純なWebサービスの文書化を開始しました。

問題は、swaggerを構成した後、ブラウザーでlocalhost:8080/swagger-ui.htmlと入力すると、次の画面に奇妙なものが表示されることです。 「ベースURLを推測できません。これは、動的なサーブレット登録を使用している場合、または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.JavaTestApplication.Javaの両方が同じパッケージ、つまりcom.test.configTestController.Javaはに属しますcom.test.controllers

これは私が持っているすべてのコードであり、pom.xmlには次の2つの依存関係があります

<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>

注釈を追加して解決しました@EnableSwagger2Applicationクラス。

@SpringBootApplication
@EnableSwagger2 //this
public class Application {

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

}

Spring-bootアプリケーションを戦争アーティファクトとしてデプロイするときに同じ問題に直面していました。組み込みTomcatを使用して(スタンドアロンのSpring-Bootアプリとして)アプリケーションを実行している間は正常に機能していましたが、warファイルをリモートTomcatにデプロイしている間は上記の問題に直面していました。

少し掘り下げてみると、warアーカイブ用のアプリケーションのサーブレットイニシャライザーが見つからなかったことがわかりました。

以下は私にとって魅力のように働いた。

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); 
   }
}
5
Amit Agarwal

swaggerが認証の背後にある場合は、SpringBootセキュリティで次のことを行う必要があります

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

次に、アクセスします Swagger UI Documentation

1
Anand

私の場合、このBean構成は問題の原因でした。

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

Springはこれを使用して、サイレントに失敗していたSpringのjacksonobjectMapperを初期化しました。オブジェクトマッパーでBeanを追加することで修正しました。

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

うーん、.pathsを.apis(RequestHandlerSelectors.basePackage( "コントローラーがcom.demo.example.controller"))。build();に変更してみてください。これを試してみてください。うまくいかない場合はお知らせください。

0
SkiiNet