我在使用GraphQL和spring-boot-starter-graphql的SpringBoot(3.2.0)应用程序上遇到了问题。
我有几个带注解的控制器,其中包含一些@SchemaMapping,@QueryMapping和@MutationMapping。由于一些我无法弄清楚的原因,一些@SchemaMapping方法将被调用,但Controller的注入依赖项为null,导致NPE。
@Controller
@AllArgsConstructor
public class MyController{
private final MyService service;
// This one is working
@SchemaMapping(typeName = "Foo", field = "bar")
public String getBar(Foo foo) {
return service.someMethod();
}
// This one is NOT working : service is null
@SchemaMapping(typeName = "Foo", field = "bar2")
public String getBar2(Foo foo) {
return service.someOtherMethod()
}
}
字符串
当我将断点放在一个@SchemaMapping方法中时,我知道它不工作,我可以看到控制器的类型是MyController$$SpringCGLIB$$0@17823
,当它工作时只是MyController
。当我查看Threads堆栈中的“错误”调用和“良好”调用时,我看到了一个区别:org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713)
方法在工作时被调用。
“良好”的堆栈跟踪示例:
java.lang.Thread.State: RUNNABLE
at com.company.project.controller.MyController.getData(MyController.java:39)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713)
at com.company.project.controller.MyController$$SpringCGLIB$$0.getData(<generated>:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.graphql.data.method.InvocableHandlerMethodSupport.doInvoke(InvocableHandlerMethodSupport.java:87)
型
“错误”堆栈跟踪示例:
java.lang.Thread.State: RUNNABLE
at com.company.project.controller.MyController.getData(MyController.java:44)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:568)
at org.springframework.graphql.data.method.InvocableHandlerMethodSupport.doInvoke(InvocableHandlerMethodSupport.java:87)
型
似乎对于某些@SchemaMapping方法,控制器的AOP代理被冻结,无法拦截。
如果任何人有任何想法是怎么回事,任何帮助是受欢迎的:).谢谢
1条答案
按热度按时间j91ykkif1#
您能否确保尝试将MyService注解为@Service并自动连接myService?
字符串
Spring的AOP基础设施自动使用CGLIB或JDK动态代理,除非有任何条件阻止它这样做。
对于AOP代理,final类通常不被认为是合适的代理目标,因为Spring AOP不能创建子类或扩展final类。它需要这种能力来为myService创建基于CGLIB的代理,通过使用它您将调用someMethod()的代理。
请注意,发生这种情况是因为@SchemaMapping
让我知道如果这对你有用。