smallrye / smallrye-graphql

Implementation for MicroProfile GraphQL
Apache License 2.0
158 stars 90 forks source link

Allow chained accessors in Entities #1696

Open krisraich opened 1 year ago

krisraich commented 1 year ago

When using GraphQL with Entities that implement chained accessors, e.g.:

...
public TestEntity setName(String name){
    this.name = name;
    return this;
}
...

the following error is thrown:

2023-01-12 10:24:08,507 ERROR [io.qua.dep.dev.IsolatedDevModeMain] (vert.x-worker-thread-0) Failed to start quarkus [Error Occurred After Shutdown]: io.quarkus.dev.appstate.ApplicationStartException: graphql.schema.validation.InvalidSchemaException: invalid schema:
"TestEntityInput" must define one or more fields.
        at io.quarkus.dev.appstate.ApplicationStateNotification.waitForApplicationStart(ApplicationStateNotification.java:58)
        at io.quarkus.runner.bootstrap.StartupActionImpl.runMainClass(StartupActionImpl.java:123)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.restartApp(IsolatedDevModeMain.java:222)
        at io.quarkus.deployment.dev.IsolatedDevModeMain.restartCallback(IsolatedDevModeMain.java:203)
        at io.quarkus.deployment.dev.RuntimeUpdatesProcessor.doScan(RuntimeUpdatesProcessor.java:537)
        at io.quarkus.deployment.dev.RuntimeUpdatesProcessor.doScan(RuntimeUpdatesProcessor.java:437)
        at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$4.handle(VertxHttpHotReplacementSetup.java:152)
        at io.quarkus.vertx.http.runtime.devmode.VertxHttpHotReplacementSetup$4.handle(VertxHttpHotReplacementSetup.java:139)
        at io.vertx.core.impl.ContextBase.lambda$null$0(ContextBase.java:137)
        at io.vertx.core.impl.ContextInternal.dispatch(ContextInternal.java:264)
        at io.vertx.core.impl.ContextBase.lambda$executeBlocking$1(ContextBase.java:135)
        at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
        at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
        at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:29)
        at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:29)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: graphql.schema.validation.InvalidSchemaException: invalid schema:
"TestEntityInput" must define one or more fields.
        at graphql.schema.GraphQLSchema$Builder.validateSchema(GraphQLSchema.java:935)
        at graphql.schema.GraphQLSchema$Builder.buildImpl(GraphQLSchema.java:929)
        at graphql.schema.GraphQLSchema$Builder.build(GraphQLSchema.java:894)

Same error also occurs when the Lombok annotation @Accessors(chain = true) is present.

Used with Quarkus version 2.15.3.Final and Smallrye GraphQL version 1.19.1

phillip-kruger commented 1 year ago

Can you please provide a reproducer ?

krisraich commented 1 year ago

Yes of course.

After further investigation, it appears that the "@Mutation" annotation is the cause of the error. The code works fine with either @Accessors(chain = true) or @Mutation("create") but not with both

package test;

import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Setter
@Getter
@Accessors(chain = true)
public class ReproducerEntity {

    private String foo;

}
package test;

import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Mutation;

@GraphQLApi
public class ReproducerApi {

    @Mutation("create")
    public ReproducerEntity create(ReproducerEntity values) {
        return null;
    }

}
pom.xml ``` 4.0.0 com.test test 1.0.0-SNAPSHOT 3.10.1 17 UTF-8 UTF-8 quarkus-bom io.quarkus.platform 2.15.3.Final true 3.0.0-M7 3.11.3 ${quarkus.platform.group-id} ${quarkus.platform.artifact-id} ${quarkus.platform.version} pom import io.quarkus quarkus-resteasy-reactive-jackson io.quarkus quarkus-smallrye-openapi io.quarkus quarkus-config-yaml io.quarkus quarkus-smallrye-graphql org.projectlombok lombok 1.18.22 io.quarkus quarkus-arc io.quarkus quarkus-junit5 test ${quarkus.platform.group-id} quarkus-maven-plugin ${quarkus.platform.version} true build generate-code generate-code-tests maven-compiler-plugin ${compiler-plugin.version} -parameters maven-surefire-plugin ${surefire-plugin.version} org.jboss.logmanager.LogManager ${maven.home} maven-failsafe-plugin ${surefire-plugin.version} integration-test verify ${project.build.directory}/${project.build.finalName}-runner org.jboss.logmanager.LogManager ${maven.home} native native false native ```
Error Log ``` 2023-01-17T12:37:55.346+01:00 WARN [io.qu.ar.impl] An error occurred during delivery of the @BeforeDestroyed(ApplicationScoped.class) event: javax.enterprise.inject.CreationException: Config root [io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig] with config phase [RUN_TIME] not initialized yet. at io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig_66229d6c2e25c4818b3ef00069aed3a5861e7464_Synthetic_Bean.create(Unknown Source) at io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig_66229d6c2e25c4818b3ef00069aed3a5861e7464_Synthetic_Bean.get(Unknown Source) at io.quarkus.hibernate.orm.runtime.HibernateOrmRuntimeConfig_66229d6c2e25c4818b3ef00069aed3a5861e7464_Synthetic_Bean.get(Unknown Source) at io.quarkus.arc.impl.CurrentInjectionPointProvider.get(CurrentInjectionPointProvider.java:62) at io.quarkus.hibernate.orm.runtime.JPAConfig_Bean.create(Unknown Source) at io.quarkus.hibernate.orm.runtime.JPAConfig_Bean.create(Unknown Source) at io.quarkus.arc.impl.AbstractSharedContext.createInstanceHandle(AbstractSharedContext.java:113) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:37) at io.quarkus.arc.impl.AbstractSharedContext$1.get(AbstractSharedContext.java:34) at io.quarkus.arc.impl.LazyValue.get(LazyValue.java:26) at io.quarkus.arc.impl.ComputingCache.computeIfAbsent(ComputingCache.java:69) at io.quarkus.arc.impl.AbstractSharedContext.get(AbstractSharedContext.java:34) at io.quarkus.hibernate.orm.runtime.JPAConfig_Observer_destroy_b8200764d6ca5f0908a962ee9c3337f12042c096.notify(Unknown Source) at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:328) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:316) at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:246) at io.quarkus.arc.impl.ArcContainerImpl.shutdown(ArcContainerImpl.java:388) at io.quarkus.arc.Arc.shutdown(Arc.java:58) at io.quarkus.arc.runtime.ArcRecorder$1.run(ArcRecorder.java:47) at io.quarkus.runtime.StartupContext.runAllInReverseOrder(StartupContext.java:84) at io.quarkus.runtime.StartupContext.close(StartupContext.java:73) at io.quarkus.runner.ApplicationImpl.(Unknown Source) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at io.quarkus.runtime.Quarkus.run(Quarkus.java:70) at io.quarkus.runtime.Quarkus.run(Quarkus.java:44) at io.quarkus.runtime.Quarkus.run(Quarkus.java:124) at io.quarkus.runner.GeneratedMain.main(Unknown Source) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:104) at java.base/java.lang.Thread.run(Thread.java:833) 2023-01-17T12:37:55.347+01:00 ERROR [io.qu.ru.bo.StartupActionImpl] Error running Quarkus: java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:104) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: java.lang.ExceptionInInitializerError at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at io.quarkus.runtime.Quarkus.run(Quarkus.java:70) at io.quarkus.runtime.Quarkus.run(Quarkus.java:44) at io.quarkus.runtime.Quarkus.run(Quarkus.java:124) at io.quarkus.runner.GeneratedMain.main(Unknown Source) ... 6 more Caused by: java.lang.RuntimeException: Failed to start quarkus at io.quarkus.runner.ApplicationImpl.(Unknown Source) ... 15 more Caused by: graphql.schema.validation.InvalidSchemaException: invalid schema: "ReproducerEntityInput" must define one or more fields. at graphql.schema.GraphQLSchema$Builder.validateSchema(GraphQLSchema.java:935) at graphql.schema.GraphQLSchema$Builder.buildImpl(GraphQLSchema.java:929) at graphql.schema.GraphQLSchema$Builder.build(GraphQLSchema.java:894) at io.smallrye.graphql.bootstrap.Bootstrap.generateGraphQLSchema(Bootstrap.java:200) at io.smallrye.graphql.bootstrap.Bootstrap.bootstrap(Bootstrap.java:119) at io.smallrye.graphql.cdi.producer.GraphQLProducer.initialize(GraphQLProducer.java:52) at io.smallrye.graphql.cdi.producer.GraphQLProducer.initialize(GraphQLProducer.java:42) at io.smallrye.graphql.cdi.producer.GraphQLProducer.initialize(GraphQLProducer.java:32) at io.smallrye.g raphql.cdi.producer.GraphQLProducer.initialize(GraphQLProducer.java:27) at io.smallrye.graphql.cdi.producer.GraphQLProducer_ClientProxy.initialize(Unknown Source) at io.quarkus.smallrye.graphql.runtime.SmallRyeGraphQLRecorder.createExecutionService(SmallRyeGraphQLRecorder.java:30) at io.quarkus.deployment.steps.SmallRyeGraphQLProcessor$buildExecutionService1691419614.deploy_1(Unknown Source) at io.quarkus.deployment.steps.SmallRyeGraphQLProcessor$buildExecutionService1691419614.deploy(Unknown Source) ... 16 more ```
t1 commented 10 months ago

1959 could be related