如何让Spring Boot 3中QueryDSL Springdoc断言与Spring Boot 2表现一致?
解决Spring Boot 3 + Springdoc 2下@QuerydslPredicate参数不生成Swagger文档的问题
1. 修正依赖配置
Springdoc 2.x(适配Spring Boot 3)的依赖结构有所调整,确保引入以下两个核心依赖,版本保持一致(建议使用与Spring Boot 3匹配的最新稳定版,比如2.2.0):
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-api</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-data-rest</artifactId> <version>2.2.0</version> </dependency>
同时确认Querydsl的JPA依赖和APT插件配置正确,保证Q类(如QBook)正常生成:
<dependency> <groupId>com.querydsl</groupId> <artifactId>querydsl-jpa</artifactId> </dependency> <plugin> <groupId>com.mysema.maven</groupId> <artifactId>apt-maven-plugin</artifactId> <version>1.1.3</version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin>
2. 启用Querydsl参数解析配置
在application.properties或application.yml中添加Springdoc的Querydsl启用配置:
springdoc.querydsl.enabled=true
3. 确保控制器注解正确
检查控制器中的@QuerydslPredicate注解是否指定了root属性,明确关联的实体类:
@GetMapping("/books") public ResponseEntity<List<Book>> listBooks( @QuerydslPredicate(root = Book.class) Predicate predicate ) { // 业务逻辑 }
4. 额外配置(若上述步骤无效)
如果仍未生成实体字段参数,可添加自定义配置类,强制Springdoc展开Predicate参数为实体字段:
@Configuration public class SpringDocQuerydslConfig { @Bean public ParameterCustomizer querydslParameterCustomizer(QuerydslPredicateParameterBuilder parameterBuilder) { return (parameterModel, methodParameter, beanParameter) -> { if (methodParameter.hasParameterAnnotation(QuerydslPredicate.class)) { // 使用Springdoc内置的参数构建器生成实体字段参数 return parameterBuilder.buildParameters(methodParameter); } return parameterModel; }; } }
完成以上步骤后,重新启动项目,Swagger文档应该会自动生成Book实体对应的id、name、bookNumber等查询参数,而非仅显示predicate对象参数。
内容的提问来源于stack exchange,提问作者rjdkolb
相关产品推荐
相关产品推荐

