springboot 3.+ 以上版本集成 mybatis、分页插件和 swagger 在线文档时会出现版本兼容问题,造成pagehelper无法自动分页,接口文档集成不成功问题。swagger在与springboot3.+版本整合也做了更新,以下版本亲测可用。
一、 pom依赖
springboot 3.2.1 使用 pagehelper需要使用 1.4.6,版本低于该版本时分页查询时,分页不起效果,使用2.+版本时则会抛出异常。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/>
</parent>
<properties>
<java.version>17</java.version>
<jackson.version>2.16.0</jackson.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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
</dependencies>
二、resources 配置文件
集成swagger需要配置 mvc的 matching-strategy: ant_path_matcher,从springboot 2.6.+ 开始就需要配置,如果不使用swagger则忽略
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: {model-path}
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: {package}
#- group: 'pathsToExclude'
# paths-to-match: '/actuator'
knife4j:
enable: true
setting:
language: zh_cn
pagehelper:
#自动识别数据库方言
auto-dialect: true
#从方法参数中取值
support-methods-arguments: true
#数据库方言
#helper-dialect: postgresql
#动态切换数据源
auto-runtime-dialect: true
#启用合理化,根据页数自动适配
reasonable: true
三、swagger配置类
@Configuration
public class WebConfig {
@Bean
public OpenAPI springShopOpenAPI() {
final Contact contact = new Contact();
contact.setName("作者信息");
return new OpenAPI()
.info(new Info().title("application name").version("0.0.1-SNAPSHOT")
.description(" service description")
.contact(contact).license(new License().name("Apache 2.0")
.url("http://springdoc.org")))
.externalDocs(new ExternalDocumentation()
.description("external document description")
.url("https://springshop.wiki.github.org/docs"));
}
四、controller编写,接口文档注解
1.controller接口文档注解
swagger 中的参数注解跟旧版本的写法差别也比较大
@RestController
@Tag(name = "消息查询")
@RequestMapping("/page")
public class PageController {
@Resource
private MessageService messageService;
@Operation(summary = "消息记录")
@GetMapping("/list")
@Parameters({
@Parameter(name = "pageOffset", required = true, example = "1"),
@Parameter(name = "pageSize", required = true, example = "10")})
public R list(String pageOffset, String pageSize) {
return messageService.page(token, pageOffset, pageSize);
}
}
2.service分页
分页逻辑写在 mapper 查询之前,pagehelper插件会完成自动分页
@Service
public class MessageService {
@Resource
private MessageMapper messageMapper;
public R page(String pageOffset, String pageSize) {
PageMethod.startPage(Integer.parseInt(pageOffset), Integer.parseInt(pageSize));
List<Message> list = messageMapper.list();
PageInfo<Message> info = new PageInfo<>(list);
return R.success(info.getList(), info.getTotal());
}
}
五、效果
knife地址: localhost:8080/doc.html
swagger地址:localhost:8080/swagger-ui.html