leangen / graphql-spqr-spring-boot-starter

Spring Boot 2 starter powered by GraphQL SPQR
Apache License 2.0
275 stars 68 forks source link

Using Spring Boot 3.3.0 results in NoSuchMethodError #151

Open ErtugrulSener opened 3 months ago

ErtugrulSener commented 3 months ago

Hey @kaqqao ,

I've tried updating my spring boot version to 3.3.0 and then got the following Stacktrace, when trying to access a graphql endpoint. Could you maybe have an eye on it?

java.lang.NoSuchMethodError: 'graphql.ExecutionInput$Builder graphql.ExecutionInput$Builder.context(java.util.function.UnaryOperator)'
    at io.leangen.graphql.util.ContextUtils.lambda$wrapContext$1(ContextUtils.java:13)
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Assembly trace from producer [reactor.core.publisher.MonoCompletionStage] :
    reactor.core.publisher.Mono.fromFuture(Mono.java:629)
    io.leangen.graphql.spqr.spring.web.HttpExecutor.lambda$execute$0(HttpExecutor.java:33)
Error has been observed at the following site(s):
    *_______Mono.fromFuture ⇢ at io.leangen.graphql.spqr.spring.web.HttpExecutor.lambda$execute$0(HttpExecutor.java:33)
    *__Mono.deferContextual ⇢ at io.leangen.graphql.spqr.spring.web.HttpExecutor.execute(HttpExecutor.java:33)
    |_             Mono.map ⇢ at io.leangen.graphql.spqr.spring.web.HttpExecutor.execute(HttpExecutor.java:36)
Original Stack Trace:
        at io.leangen.graphql.util.ContextUtils.lambda$wrapContext$1(ContextUtils.java:13)
        at graphql.ExecutionInput.transform(ExecutionInput.java:164)
        at io.leangen.graphql.util.ContextUtils.wrapContext(ContextUtils.java:13)
        at io.leangen.graphql.GraphQLRuntime$InputTransformer.instrumentExecutionInput(GraphQLRuntime.java:126)
        at graphql.GraphQL.lambda$executeAsync$9(GraphQL.java:421)
        at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
        at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2309)
        at graphql.GraphQL.executeAsync(GraphQL.java:418)
        at io.leangen.graphql.spqr.spring.web.HttpExecutor.lambda$execute$0(HttpExecutor.java:33)
        at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:47)
        at reactor.core.publisher.Mono.subscribe(Mono.java:4568)
        at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler$DeferredResultSubscriber.connect(ReactiveTypeHandler.java:466)
        at org.springframework.web.servlet.mvc.method.annotation.ReactiveTypeHandler.handleValue(ReactiveTypeHandler.java:163)
        at org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitterReturnValueHandler.handleReturnValue(ResponseBodyEmitterReturnValueHandler.java:154)
        at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at plx.mcs.erfassung.service.configurations.filters.AttachUsernameFilter.doFilterInternal(AttachUsernameFilter.java:26)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:109)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at plx.mcs.erfassung.service.configurations.filters.RequestWrapperFilter.doFilterInternal(RequestWrapperFilter.java:54)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
        at java.base/java.lang.Thread.run(Thread.java:833)

Thanks in advance.

ErtugrulSener commented 3 months ago

It seems like this method 'Builder.context' was deprecated since 2021-07-05. It's part of the graphql-java dependency. But it still exists, Idk why we get a "NoSuchMethod" error.

agusevas commented 3 months ago

The stack trace is a bit misleading. The problem lies in graphql-java version 22.0. Spring Boot 3.3 imports graphql-java:22.0 version and overrides SPQR graphql-java dependency. Adding property <graphql-java.version>21.4</graphql-java.version> in Maven solves the issue.

kaqqao commented 3 months ago

A new release is coming soon that will be based on 22.0. But this is an evergreen advice: always, always, without an exception, check that your graphql-java version is compatible, it's the number one suspect for weird errors.

azura-global commented 2 months ago

A new release is coming soon that will be based on 22.0. But this is an evergreen advice: always, always, without an exception, check that your graphql-java version is compatible, it's the number one suspect for weird errors.

@kaqqao Do you know how soon 22.0 will be released?