Spring Boot 3迁移后GraphQLResolver不生效,如何启用?
Spring Boot 3.3.0中GraphQLResolver不生效的解决方案
针对你迁移后Resolver无法被调用的问题,可按以下步骤排查修复:
1. 修正Resolver方法参数
Spring GraphQL要求实体字段的解析方法必须接收对应的DTO实例作为参数,否则无法关联到具体对象。修改ProductResolver的test方法:
@Component public class ProductResolver implements GraphQLResolver<ProductDTO> { // 添加ProductDTO参数,关联到当前要解析的实体实例 public boolean test(ProductDTO productDTO) { return true; } }
2. 修复返回类型不匹配问题
你的ProductQuery方法返回类型是ProductDTO,但实际返回的是Product实例,类型不匹配会导致Resolver无法识别目标对象。需确保返回正确的DTO实例:
@Controller @Transactional public class ProductQuery { @QueryMapping public ProductDTO product(@Argument String code) { if (code != null && !code.isEmpty()) { // 改为创建ProductDTO实例,而非Product ProductDTO productDTO = new ProductDTO(); productDTO.setCode(code); return productDTO; } return null; } }
如果Product和ProductDTO是同一类,请统一类名避免混淆。
3. 确认依赖兼容性
Spring Boot 3.3.0需使用官方的Spring GraphQL Starter,确保pom.xml中仅包含以下依赖,排除旧的GraphQL第三方库(如graphql-java-tools):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-graphql</artifactId> </dependency>
4. 验证Spring容器扫描范围
确保ProductResolver所在的包被Spring Boot自动扫描覆盖。如果包路径不在@SpringBootApplication的默认扫描范围内,需添加@ComponentScan指定包路径:
@SpringBootApplication @ComponentScan(basePackages = {"com.your.package"}) // 替换为你的实际包路径 public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
5. 开启调试日志排查
添加日志配置查看GraphQL执行细节,确认Resolver是否被加载:
在application.properties中添加:
logging.level.org.springframework.graphql=DEBUG logging.level.graphql=DEBUG
启动应用后,检查日志中是否有ProductResolver的加载记录,以及请求时是否触发了该Resolver的test方法。
内容的提问来源于stack exchange,提问作者Hytobi
相关产品推荐
相关产品推荐

