Springboot3.x 与 Springdoc & swagger -- 迁移

文章讲述了在SpringBoot3.x升级过程中由于javax包被迁移到jakarta而导致的与swagger的不兼容问题。解决方案是采用springdoc-openapi-starter-webmvc-ui替代swagger,详细介绍了配置步骤,包括引入依赖、yaml配置以及SpringDocConfiguration的设置。此外,还提到了在迁移过程中遇到的SwaggerWelcomeCommon类找不到的问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

springboot升级为3.x时,swagger的迁移会出现一些问题,目前springboot3.x将 包javax下的所有内容都迁移到了jakarta下,比如HttpServletRequest, 而swagger还是使用的包javax, 导致出现不兼容的问题,因此可以使用springdoc来替代以前的swagger包.

二、步骤

  1. webmvc只需导入一个jar包
<dependency>
	<groupId>org.springdoc</groupId>
	<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
	<version>2.0.2</version>
</dependency>
  1. yml配置
######## swagger configuration ###############
springdoc:
  packages-to-scan: ##需要扫描的包,可以配置多个
    - com.hmy.azure.controller
  paths-to-exclude:  ##配置不包含在swagger文档中的api
    - /api/test/**
    - /api/mockito/data
  swagger-ui:
    enabled: true  #开启/禁止swagger,prod可以设置为false
    path: /swagger-ui.html  #swagger页面
  api-docs:
    enabled: true #开启/禁止api-docs, prod可以设置为false
    path: /api-docs #api的json文档
  use-management-port: false
  ### 设置为true时, management也需要设置
#  use-management-port: true
#  show-actuator: true

#management:
#  server:
#    port: 9090
#  endpoints:
#    web:
#      exposure:
#        include: openapi,swagger-ui
  1. SpringDocConfiguration 配置文件
package com.hmy.azure.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringDocConfiguration {
    @Bean
    public OpenAPI openAPI(){
        return new OpenAPI()
                .info(apiInfo())
                .externalDocs(new ExternalDocumentation()
                        .description("SpringDoc Wiki Documentation")
                        .url("https://springdoc.org/v2"));
    }

    private Info apiInfo() {
        return new Info()
                .title("Azure Demo API Doc")
                .description("springfox swagger 3.0 demo")
                .version("1.0.0")
                .contact(new Contact()
                        .name("<Your name>")
                        .url("<Your url>")
                        .email("<Your email>")
                )
                .license(new License()
                        .name("Apache 2.0")
                        .url("http://www.apache.org/licenses/LICENSE-2.0.txt")
                );
    }
}

  1. UserController类
package com.hmy.azure.controller;

import com.hmy.azure.bean.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Operation(summary = "List users",description = "List users by conditions")
    @Parameters({
            @Parameter(in = ParameterIn.HEADER,name = "idToken",description = "The Authorization token",required = true),
            @Parameter(in = ParameterIn.QUERY,name = "status",description = "The user's status"),
            @Parameter(in = ParameterIn.QUERY,name = "department",description = "The user's department")
    })
    @GetMapping("/list")
    public ResponseEntity<Object> listUser(@RequestParam(required = false) String status,
                                          @RequestParam(required = false) String department){
        return ResponseEntity.ok("SUCCESS");
    }

    @Operation(summary = "Get a user",description = "Get user by id")
    @Parameter(in = ParameterIn.PATH,name = "id",description = "The user's id",required = true)
    @GetMapping("/{id}")
    public ResponseEntity<Object> getUserById(@PathVariable String id){
        return ResponseEntity.ok("SUCCESS");
    }

    @Operation(summary = "Create a user",description = "Create a user")
    @PostMapping
    public ResponseEntity<Object> createUser(@RequestBody User user){
        return ResponseEntity.ok("SUCCESS");
    }
}

三、效果图

P1:
在这里插入图片描述

P2:
参数

P3:
在这里插入图片描述

四、遇到过的问题

问题: 找不到SwaggerWelcomeCommon类, 报错如下

Description:
Parameter 3 of method indexPageTransformer in org.springdoc.webmvc.ui.SwaggerConfig required a bean of type 'org.springdoc.webmvc.ui.SwaggerWelcomeCommon' that could not be found.
Action:
Consider defining a bean of type 'org.springdoc.webmvc.ui.SwaggerWelcomeCommon' in your configuration.

原因: yml中use-management-port设置为了true
解决方法:yml中设置 use-management-port: false
问题参考链接: SwaggerWelcomeCommon could not be found

五、相关链接

  1. 注解的替换及使用见官方文档
    在这里插入图片描述
### 配置Spring Boot项目以集成和配置springdoc-openapiSwagger-UI #### 1. 添加依赖项 为了使Spring Boot应用程序能够使用`springdoc-openapi`并显示Swagger UI,需在项目的构建文件中加入相应的依赖。对于Maven项目,在`pom.xml`中添加如下依赖: ```xml &lt;dependency&gt; &lt;groupId&gt;org.springdoc&lt;/groupId&gt; &lt;artifactId&gt;springdoc-openapi-starter-webmvc-ui&lt;/artifactId&gt; &lt;version&gt;2.0.4&lt;/version&gt; &lt;!-- 版本号应根据实际情况调整 --&gt; &lt;/dependency&gt; ``` 此操作引入了必要的库来支持OpenAPI 3标准下的API文档自动生成以及通过Swagger UI可视化这些文档[^2]。 #### 2. 应用程序属性设置 通常情况下,默认配置已经足够让`springdoc-openapi`正常工作;然而,如果希望进一步定制化行为,则可以在`application.properties`或`application.yml`文件内指定额外选项。例如: ```properties # application.properties 文件片段 springdoc.api-docs.path=/v3/api-docs springdoc.swagger-ui.path=/swagger-ui.html ``` 上述配置更改了默认路径以便更好地适应特定需求[^3]。 #### 3. 使用注解描述API端点 为了让生成的API文档更加详尽准确,建议开发者充分利用Java Bean Validation约束注解(如`@NotNull`, `@Min`, `@Max`, `@Size`等),以及其他任何有助于说明参数含义及其预期值范围的信息。这不仅提高了开发效率,还增强了最终用户的体验质量。 #### 4. 访问Swagger UI界面 完成以上步骤之后,启动Spring Boot应用,并访问浏览器地址栏输入`http://localhost:&lt;port&gt;/swagger-ui.html`(其中`&lt;port&gt;`代表实际使用的服务器监听端口),即可看到由`springdoc-openapi`自动创建好的交互式API文档页面。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值