springboot swagger3“加载远程配置失败。”

问题描述 投票:0回答:8

Spring Boot 2.6.3 与 Springdoc。

        <dependency>
            <groupId>org.springdoc</groupId>
            <artifactId>springdoc-openapi-ui</artifactId>
            <version>1.6.5</version>
        </dependency>

applicaton.yaml
中,当我将路径设置为/v3/api-docs或将其删除时,这意味着使用默认路径“/v3/api-docs”。 Swagger UI 页面通过 API 正确显示 http://localhost:8080/swagger-ui/index.html

但是我想覆盖下面的路径

  api-docs.path: /bus/v3/api-docs

然后 Swagger UI 显示“无法加载远程配置”错误:

load api list error

spring-boot swagger-ui springdoc springdoc-openapi-ui
8个回答
30
投票
Make sure to add "/v3/api-docs/**" in configure method.
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/swagger-ui/**", "
/v3/api-docs/**");
    }
}

11
投票

我遇到了同样的问题,如果您位于反向代理后面,解决方法是在 application.yml 中添加以下属性

server:
  forward-headers-strategy: framework

由于以下原因需要这样做

Swagger 依赖内部路由从客户端的角度发出请求。将服务置于反向代理后面而不提供 X-Forwarded 标头将导致用户无法按预期使用文档

来源 -> https://medium.com/swlh/swagger-spring-boot-2-with-a-reverse-proxy-in-docker-8a8795aa3da4


10
投票

如果您在应用程序中使用 Spring Security,则必须在配置中包含 URL。 请将下面的代码添加到您的项目中。

@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/swagger-ui/**", "/bus/v3/api-docs/**");
    }
}

7
投票

在浏览器中执行“清空缓存并硬刷新”。


5
投票

我想我已经解决了问题(感谢@Ivan Zaitsev),只是想对答案添加更多说明。

我也更改了 api-docs.path 属性,并且遇到了同样的问题。当我检查 swagger UI 页面上的请求时,swagger-config 请求返回 404,因为它仍在尝试从旧 URL 获取配置。

即使我更改了 api-docs.path 属性,这里还是尝试检索 swagger-config 的请求 URL。 http://localhost:8080/api/v3/api-docs/swagger-config

原来是openapi-ui相关的问题,因为我清除浏览器缓存和cookie后就能够解决了。最好使用隐身浏览器进行测试,因为它不保存会话上的任何数据。


1
投票

这是一个老问题,但是当我寻找答案时,我来到了这里,所以在我让它与新版本一起工作后,我决定分享我的答案,也许有人觉得它有用。

这是我对 spring security - 3.1.0 和 openApi 2.1.0 的 gradle 实现:

implementation "org.springframework.boot:spring-boot-starter-security:3.1.0"
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0"
@EnableWebSecurity
public class SecurityConfiguration {
    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeHttpRequests()
                .requestMatchers("/swagger-ui/**",
                        "/swagger-resources/*",
                        "/v3/api-docs/**")
                .permitAll()
                .anyRequest()
                .authenticated();
        return http.build();
    }
}

您需要在 requestMatcher 中指定路径,例如“/bus/v3/api-docs”。 最好的选择是一一实施:

  • 检查“/**”是否有效,然后
  • 检查 /bus/** 是否有效(在我的例子中,匹配器的默认路径“/api”是为整个项目设置的,整个路径看起来像这样 - /api/swagger-ui/** 不起作用,但是 / swagger-ui/** 工作)
  • 然后再次检查 /bus/v3/** 是否工作

** - 两颗星是通配符。

即使我的 swagger 路径看起来像这样:api/swagger-ui/index.html#/ 我需要添加匹配器:v3/api-docs/** 才能使其工作。


0
投票

如果您使用SpringBoot v3,则必须使用springdoc-openapi v2

https://springdoc.org/v2/

以gradle为例:

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

0
投票

如果您使用

org.spring framework.security:spring-security-config:6.1.3
,这将能够帮助您。

@Configuration
@EnableWebSecurity
class WebSecurity {
    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
   
        http.authorizeHttpRequests {
            it.requestMatchers(antMatcher("/swagger-ui/**")).permitAll()
            it.requestMatchers(antMatcher("/v3/api-docs/**")).permitAll()
            it.anyRequest().authenticated()
        }
        return http.build()
    }
 
}
© www.soinside.com 2019 - 2024. All rights reserved.