API Gatewayの背後にSpring Bootサービスがあります。 Springfoxの以前のバージョン-2.1.2では、swagger-ui.html
ページの読み込みに問題はありませんでした。これはSpring Boot 1.4.3.RELEASEで動作しました。それ以降、Boot 1.5.7にアップグレードし、Springfoxを2.8.0にアップグレードしました。
次に、ページをロードすると、次の長いメッセージを含む警告ボックスが表示されます。
ベースURLを推測できません。これは、動的サーブレット登録を使用する場合、またはAPIがAPI Gatewayの背後にある場合に一般的です。ベースURLは、すべてのSwaggerリソースが提供されるルートです。例えばAPIが http://example.org/api/v2/api-docs で利用できる場合、ベースURLは http://example.org/api/ です。 。場所を手動で入力してください
オンラインで検索するヒントをいくつか入手しましたが、それらの状況が当てはまるとは思われません。 1つは、単にバージョンを元に戻すと、同じAPIゲートウェイを介して再び機能し始めることです。
トラフィックを追跡すると、.htmlページによって行われた3つのXHRリソースへの呼び出しが問題を引き起こしているようです。これらはAPIゲートウェイから401を返しています。また、401が返されるのは、Cookieが渡されないためです。
3つの呼び出しは次のとおりです。
これらのURLを純粋なブラウザー要求としてロードすると、Cookieが送信されるため、それらは機能します。
HTMLがSwagger JSONおよび実際のサービス呼び出しと同じアドレスから提供されているため、CORSが適用されるかどうかは疑問です。
なぜこれが起こっているのでしょうか?誰かが同様の問題に直面しましたか?回避策の提案?よろしくお願いします。
セキュリティ構成に追加-認証のためにスキップされる次のURL ::
private static final String[] AUTH_WHITELIST = {
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
};
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(AUTH_WHITELIST);
}
春のブートクラスで以下の注釈を追加すると、この問題が解決しました。
@ EnableSwagger2
Swaggerバージョンを使用しています
<version>2.9.2</version>
以下の編集を参照してください
春のセキュリティを使用していますか?
はいの場合、おそらく次のようなリソースをスキップします(そうですか?):"/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**"
変更してみてください"/swagger-resources/**"
から"**/swagger-resources/**"
。
Swaggerの特定のセキュリティ構成は次のとおりです。
private static final String[] AUTH_LIST = {
// -- swagger ui
"**/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**"
};
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().antMatchers(AUTH_LIST).authenticated()
.and()
.httpBasic().authenticationEntryPoint(swaggerAuthenticationEntryPoint())
.and()
.csrf().disable();
}
@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName("Swagger Realm");
return entryPoint;
}
必要な場合は、サンプルのプロジェクトをGitHubに送信して、私のセキュリティ/ swagger構成について詳しく知ることができます。
EDIT 2018/04/10
この問題は、Springfoxの誤ったバージョンが原因で発生します。 問題を解決するには、githubでこの問題を参照してください 。
後世へ:
Pom.xml内
...
<repositories>
<repository>
<id>swagger</id>
<name>swagger</name>
<url>http://oss.jfrog.org/artifactory/oss-snapshot-local</url>
</repository>
</repositories>
...
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.1-SNAPSHOT</version>
</dependency>
...
WebSecurityConfigAdapterを拡張するクラス:
@Configuration
public class WebSecurityConfigEntryPointApplication extends WebSecurityConfigurerAdapter {
private static final List<String> AUTH_LIST = Arrays.asList(
"/swagger-resources/**",
"/swagger-ui.html**",
"/webjars/**",
"favicon.ico");
@Autowired
private RestAuthenticationEntryPoint restAuthenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**").authorizeRequests().anyRequest().authenticated()
.and()
.exceptionHandling()
.defaultAuthenticationEntryPointFor(swaggerAuthenticationEntryPoint(), new CustomRequestMatcher(AUTH_LIST))
.and()
.httpBasic()
.authenticationEntryPoint(restAuthenticationEntryPoint)
.and()
.csrf().disable();
}
@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
entryPoint.setRealmName("Swagger Realm");
return entryPoint;
}
private class CustomRequestMatcher implements RequestMatcher {
private List<AntPathRequestMatcher> matchers;
private CustomRequestMatcher(List<String> matchers) {
this.matchers = matchers.stream().map(AntPathRequestMatcher::new).collect(Collectors.toList());
}
@Override
public boolean matches(HttpServletRequest request) {
return matchers.stream().anyMatch(a -> a.matches(request));
}
}
}
RestAuthenticationEntryPoint:
@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
}
}
これは私に起こりました、私はSpringBoot 1.5.16とSpringfox 2.9.1を使用していました。
私のapplication.properties
でserver.servlet-path=/api
を定義しましたが、どういうわけか、swagger-uiは定義された値を無視していました。私はこれを機能させるために非常に多くの異なる方法を試しました、そして最後に回避策を見つけました:
@Configuration
@EnableSwagger2
public class SwaggerConfiguration extends WebMvcConfigurationSupport {
@Bean
public Docket apiMonitoramento() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("REST API")
.description("Servicesx")
.build();
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
私は http:// localhost:8080/context/swagger-ui.html にアクセスしていましたが、その構成では正しいURLは次のようになります: http:// localhost:8080/context/api /swagger-ui.html
Springfox-swagger2とspringfox-swagger-uiの依存関係を2.9.2にアップグレードし、basePackageが適切に指定されていることを確認します
return new Docket(DocumentationType.SWAGGER_2).select()
.apis(RequestHandlerSelectors
.basePackage("org.abc.xyz.controller"))
.paths(PathSelectors.regex("/.*"))
.build().apiInfo(apiEndPointsInfo());
私の場合、問題の原因は次のとおりでした。
@ComponentScan(basePackageClasses = {ApplicationRoot.class })
2回に2回Javaファイル。
余分なものを削除した後、問題はなくなりました。
ポート8080で試してください-8080に変更した後、私のために働きました
私は春のセキュリティを使用していませんこの質問が発生しました。私のプロジェクトではMaven Multiple Moduleを使用しています。この質問がlocalhost:8080/swagger-ui.htmlにアクセスしたとき、最初に@ EnableSwagger2をSwaggerConfクラスに追加し、最後に@EnableSwaggerをSpringBoot Applicationクラスに移動して、この質問を解決します。最初:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api(){
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.zuoyan."))
.paths(PathSelectors.any())
.build();
}
}
最終的に:
@SpringBootApplication(scanBasePackages = {"com.zuoyan.springboot.appmissionhall"})
@EnableSwagger2
public class ApplicationStartUpApplication {
public static void main(String[] args) {
SpringApplication.run(ApplicationStartUpApplication.class, args);
}
}
追加した @EnableSwagger2WebMvc
をAppクラスに追加して修正します。 Spring boot 2.3.0.BUILD-SNAPSHOTとio.springfox 3.0.0-SNAPSHOTを使用しています。 SpringFoxConfigクラスは同じままです。
package com.telixia.educare.academy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
@EnableSwagger2WebMvc
@SpringBootApplication
public class AcademyApplication {
public static void main(String[] args) {
SpringApplication.run(AcademyApplication.class, args);
}
}
特別なコンポーネントスキャンオプションを指定しない場合、Spring Boot Applicationクラス(@SpringBootApplication)の階層にないパッケージに@ EnableSwagger2アノテーションを含むクラスを配置すると、この問題が発生します。
"de.oopexpert.app"にSpring Boot Applicationクラスを想定し、@ EnableSwagger2注釈付きクラスを...
@ComponentScan(basePackages = {"de.oopexpert"})を追加してコンポーネントスキャンオプションを調整し、階層の別のルートを指定できます。