我对此有点迷失,因为它通常是开箱即用的。我正在制作一个小型 java spring-boot Rest api,为了获得漂亮的 API 描述和测试页面,我使用 Swagger。除了这次它不显示我的应用程序的内容,它显示默认的宠物商店页面。
这是我在 pom 中得到的(在我的其他应用程序中看起来是一样的):
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.19</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
我也尝试过:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${springfox.version}</version>
</dependency>
但这并没有什么区别。不知道从这里去哪里。
您可能只是访问了错误的网址。这是我犯的一个错误。以我的项目为例:
OpenAPI 页面 向我提供了这一点:
Swagger UI 页面将在以下位置提供:
和 OpenAPI 描述将在以下 url 中提供,格式为 json:http://server:port/context-path/swagger-ui.html
http://server:port/context-path/v3/api-docs
- 服务器:服务器名称或IP
- 端口:服务器端口
- context-path:应用程序的上下文路径
以我的 springboot 3 为例, 原因是我的安全过滤器不知道: http://127.0.0.7:9000/v3/api-docs/swagger-config
症状: 我的 swagger-ui/index.html 向我展示了 Petshop 当我没有登录时;当我登录时向我展示了钱;
解决方法:
@EnableWebSecurity
@Configuration(proxyBeanMethods = false)
public class DefaultSecurityConfig {
@Bean
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize ->
authorize.requestMatchers(
"/swagger-ui.html","/swagger-ui/**",
"/v3/api-docs/**" //<<---(1)
).permitAll())
.authorizeHttpRequests(authorize ->
authorize.anyRequest().authenticated()
)
.formLogin(withDefaults());
return http.build();
}
...
在我的例子中,两个 URL(swagger-ui/index.html 和 swagger-ui.html)与第一个重定向到第二个是等效的。 问题就简单多了。在 Swagger UI 本身中,有一个 opendoc 源文本框,其中包含 Petstore API 的默认值。要加载您自己的 API,只需将文本框中的 URL 替换为:
{Application Context Path}/v3/api-docs
然后点击探索。