spring 使用@SchemaMapping时,注入的Controller依赖项有时为null

uoifb46i  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(183)

我在使用GraphQL和spring-boot-starter-graphql的SpringBoot(3.2.0)应用程序上遇到了问题。
我有几个带注解的控制器,其中包含一些@SchemaMapping,@QueryMapping和@MutationMapping。由于一些我无法弄清楚的原因,一些@SchemaMapping方法将被调用,但Controller的注入依赖项为null,导致NPE。

  1. @Controller
  2. @AllArgsConstructor
  3. public class MyController{
  4. private final MyService service;
  5. // This one is working
  6. @SchemaMapping(typeName = "Foo", field = "bar")
  7. public String getBar(Foo foo) {
  8. return service.someMethod();
  9. }
  10. // This one is NOT working : service is null
  11. @SchemaMapping(typeName = "Foo", field = "bar2")
  12. public String getBar2(Foo foo) {
  13. return service.someOtherMethod()
  14. }
  15. }

字符串
当我将断点放在一个@SchemaMapping方法中时,我知道它不工作,我可以看到控制器的类型是MyController$$SpringCGLIB$$0@17823,当它工作时只是MyController。当我查看Threads堆栈中的“错误”调用和“良好”调用时,我看到了一个区别:org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713)方法在工作时被调用。
“良好”的堆栈跟踪示例:

  1. java.lang.Thread.State: RUNNABLE
  2. at com.company.project.controller.MyController.getData(MyController.java:39)
  3. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
  4. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  5. at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.lang.reflect.Method.invoke(Method.java:568)
  7. at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:352)
  8. at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:713)
  9. at com.company.project.controller.MyController$$SpringCGLIB$$0.getData(<generated>:-1)
  10. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
  11. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  12. at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  13. at java.lang.reflect.Method.invoke(Method.java:568)
  14. at org.springframework.graphql.data.method.InvocableHandlerMethodSupport.doInvoke(InvocableHandlerMethodSupport.java:87)


“错误”堆栈跟踪示例:

  1. java.lang.Thread.State: RUNNABLE
  2. at com.company.project.controller.MyController.getData(MyController.java:44)
  3. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
  4. at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
  5. at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.lang.reflect.Method.invoke(Method.java:568)
  7. at org.springframework.graphql.data.method.InvocableHandlerMethodSupport.doInvoke(InvocableHandlerMethodSupport.java:87)


似乎对于某些@SchemaMapping方法,控制器的AOP代理被冻结,无法拦截。
如果任何人有任何想法是怎么回事,任何帮助是受欢迎的:).谢谢

j91ykkif

j91ykkif1#

您能否确保尝试将MyService注解为@Service并自动连接myService?

  1. @Autowire
  2. private MyService myService;

字符串
Spring的AOP基础设施自动使用CGLIB或JDK动态代理,除非有任何条件阻止它这样做。
对于AOP代理,final类通常不被认为是合适的代理目标,因为Spring AOP不能创建子类或扩展final类。它需要这种能力来为myService创建基于CGLIB的代理,通过使用它您将调用someMethod()的代理。
请注意,发生这种情况是因为@SchemaMapping
让我知道如果这对你有用。

相关问题