You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:25:26