Springfox-swagger2 UIが表示する理由Unable to infer base url.
私の知る限り、典型的なSwaggerスプリングブート構成を使用しています。
スクリーンショットでわかるように、UIを支えるswagger-foxのURLはexample.com/apiです。注:標準のSpring Whitelabel Error Page
に移動すると: https:// localhost:9600/api/v2/api-docs / これが問題の原因だと思う? Springがロードしなかったエラーは表示されませんspringfox-swagger2
それで、なぜそれが機能しないのか分かりません。
私の設定は次のようになります(そして、ネットでアドバイスを検索することから、この設定のあらゆる種類のバリエーションを試しました):
@EnableSwagger2
@EnableWebMvc
@ComponentScan(basePackages = {"com.company.project"})
public class SwaggerConfig
{
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.boot")))
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.cloud")))
.apis(Predicates.not(RequestHandlerSelectors.basePackage("org.springframework.data.rest.webmvc")))
.paths(PathSelectors.any())
.build();
}
}
そして
<!-- to generate /swagger-ui.html -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
注:興味深いことに、バージョン2.6.0を試してみると、モーダルポップアップは表示されませんが、Swagger UIには0のAPIコンテンツが表示されます。だから、モーダルはかなり新しいものでなければならないことを知っていますか?
ここに十分な情報がない場合は、コメントを残してください。
私の問題の解決策は、@EnableSwagger2
アノテーションをDocket BeanとともにメインのConfigurationクラスに移動することでした。
Docket Beanを使用してサブパッケージに別のクラスを作成し、SpringでスキャンしてBeanをロードすることを期待していました。おそらく、そのドケットクラスに@Component
の注釈を付けられなかったか、問題が他の何かであった可能性がありますが、うまくいきました。
Markが示唆するように、注釈付きのSpringBootApplicationを追加することで問題を解決できました。
@EnableSwagger2
私にとって問題は、Spring Securityがswagger-uiに必要なリソースへのアクセスを許可していないことでした。解決策は、次のパスへの匿名アクセスを許可することでした。
私の場合、これらのリソースに認証なしでアクセスできることは問題ありません。
SpringBootServletInitializerでメインクラスを拡張するだけです。それはうまくいきます。以下のように参照してください。
public class TestApp extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(TestApp.class, args);
}
}
Spring 2の場合、@ SpringBootApplicationアノテーションを使用し、SpringBootServletInitializerからクラスアプリケーションを拡張し、SpringApplicationBuilderメソッドをオーバーライドします。
@SpringBootApplication
public class TestApp extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(TestApp.class);
}
public static void main(String[] args) {
SpringApplication.run(TestApp.class, args);
}
}
スプリングブーツを使用しています。
私の場合、パッケージ名を間違えました。私のプロジェクトでは、基本パッケージ名は
org.liferayasif.documents
だから私の設定ファイルは中にあるべきです
org.liferayasif.documents.config
config-> uは任意の名前を付けることができます。
しかし、間違って以下のように別のパッケージ名を付けました
org.liferayasif.config
私の場合、適切なパッケージ名の中に構成ファイルを入れたら
org.liferayasif.documents.config
その後、正常に機能しました。
私の場合、springboot(2.1.2)とswagger2(2.9.2)Tomcat8.5のwarファイルとしてのアプリケーションで、同じエラーが発生します。
後で、このクラスファイルを拡張するだけで修正できましたAppConfig extends SpringBootServletInitializer
完全なAppConfigファイル
package org.mydomain
import Java.net.URL;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication(scanBasePackages = "org.mydomain")
@EntityScan({"org.mydomain.entity"})
@EnableJpaRepositories({"org.mydomain.repository"})
@EnableSwagger2
@EnableScheduling
public class AppConfig extends SpringBootServletInitializer {
// We can optionally have spring boot way of starting main method
public static void main(String[] args) {
SpringApplication.run(AppConfig.class, args);
}
}
これは、SpringbootアプリケーションをTomcatに展開する方法を紹介したブログです
注:デフォルトの実装を使用するだけのswagger docketを構成していません。
Spring Securityメソッドでリソースへの匿名アクセスを追加する必要がありました:protected void configure(HttpSecurity http)
.antMatchers("/api/**", "/swagger-ui.html", "/webjars/**", "/v2/**", "/swagger-resources/**").anonymous()
そして、それは働き始めます。