私はSwaggerを初めて使用し、SpringBootを使用して構築した非常に単純なWebサービスの文書化を開始しました。
問題は、swaggerを構成した後、ブラウザーでlocalhost:8080/swagger-ui.htmlと入力すると、次の画面に奇妙なものが表示されることです。 「ベースURLを推測できません。これは、動的なサーブレット登録を使用している場合、またはAPIがAPIゲートウェイの背後にある場合に一般的です」というポップアップメッセージ。
質問が繰り返されているように見えるかもしれませんが、これらすべての回答が与えられただけでは、これをまったく解決できませんでした。以下に、問題が発生しなかったスクリーンショットと完全なコードを投稿しました。間違えたら理解させてください。
コード
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には次の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>
注釈を追加して解決しました@EnableSwagger2
Applicationクラス。
@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);
}
}
swaggerが認証の背後にある場合は、SpringBootセキュリティで次のことを行う必要があります
http.authorizeRequests().antMatchers("/swagger-resources/**").permitAll().anyRequest().fullyAuthenticated();
次に、アクセスします Swagger UI Documentation
私の場合、このBean構成は問題の原因でした。
@Bean
public CsvMapper csvSerializerMapper() {
stuff()
}
Springはこれを使用して、サイレントに失敗していたSpringのjacksonobjectMapperを初期化しました。オブジェクトマッパーでBeanを追加することで修正しました。
@Autowired
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.createXmlMapper(false).build();
}
うーん、.pathsを.apis(RequestHandlerSelectors.basePackage( "コントローラーがcom.demo.example.controller"))。build();に変更してみてください。これを試してみてください。うまくいかない場合はお知らせください。