SpringBoot 3.2.0 GraphQL中@SchemaMapping方法依赖注入空指针问题
解决Spring Boot 3.2.0 GraphQL控制器部分@SchemaMapping方法依赖注入Null问题
可行解决方案
1. 替换为@GraphQLController注解
Spring GraphQL提供了专门的@GraphQLController注解替代通用的@Controller,它能确保Spring正确处理GraphQL控制器的代理逻辑,避免部分方法绕过AOP代理直接调用未初始化的实例。修改后的代码如下:
@GraphQLController @AllArgsConstructor public class MyController{ private final MyService service; @SchemaMapping(typeName = "Foo", field = "bar") public String getBar(Foo foo) { return service.someMethod(); } @SchemaMapping(typeName = "Foo", field = "bar2") public String getBar2(Foo foo) { return service.someOtherMethod(); } }
2. 强制使用CGLIB代理并暴露所有方法
在控制器类上添加@Scope注解指定代理模式,确保所有方法都通过Spring管理的CGLIB代理实例调用:
@Controller @AllArgsConstructor @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) public class MyController{ private final MyService service; // 方法保持不变 }
3. 检查AOP切面的覆盖范围
如果自定义了AOP切面,确认切点表达式覆盖所有@SchemaMapping方法,避免部分方法未被切面拦截导致代理逻辑失效。例如:
@Aspect @Component public class YourAspect { @Pointcut("@annotation(org.springframework.graphql.data.method.annotation.SchemaMapping)") public void schemaMappingMethods() {} @Around("schemaMappingMethods()") public Object aroundSchemaMapping(ProceedingJoinPoint joinPoint) throws Throwable { // 切面逻辑 return joinPoint.proceed(); } }
原因分析
Spring Boot 3.2.0中,GraphQL的方法注册机制在处理部分@SchemaMapping方法时,可能错误地获取了未被Spring容器完整初始化的代理实例(或直接调用原始类方法),导致依赖注入的服务对象为null。具体表现为:
- 正常调用的方法通过CGLIB代理的拦截器(
DynamicAdvisedInterceptor)路由到容器管理的实例,依赖正常注入; - 异常调用的方法直接访问代理类的原始方法,未经过拦截器,而该代理实例的依赖字段未被正确初始化。
内容的提问来源于stack exchange,提问作者Benoit Cuvelier
相关产品推荐
相关产品推荐

