Giter VIP home page Giter VIP logo

gorm-graphql's Introduction

gorm-graphql's People

Contributors

emrichardsone avatar graemerocher avatar guillermocalvo avatar jamesdh avatar jameskleeh avatar kirpi4ik avatar puneetbehl avatar renovate[bot] avatar richardson-e avatar sdelamo avatar tkvw avatar valentingoebel avatar zacharyklein avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gorm-graphql's Issues

how to create mutation with foreign key?

I want to create mutation with domain class talk ,how to write the document?

@GrailsCompileStatic
class Speaker {
    String firstName
    String lastName
    String name
    String email
    String bio
    static hasMany = [talks: Talk]
    static graphql = true 
    static constraints = {
        email nullable: true, email: true
        bio nullable: true
    }
    static mapping = {
        bio type: 'text'
        name formula: 'concat(FIRST_NAME,\' \',LAST_NAME)'
        talks sort: 'id'
    }
}

@GrailsCompileStatic
class Talk {
    Speaker speaker
    String title
    int duration
    static graphql = true 
    static belongsTo = [speaker: Speaker]
}

if i use the code like this:

mutation {
  talkCreate(talk: {
    title: "about K8S"
    duration: 120
    speaker: {
        id: 1
    }
  }) {
    id
    title
    duration
    speaker {
        id
    }
    errors {
      field
      message
    }
  }
}

the speaker_id always set null, why?

Custom Operations registered using EntityDataFetcher do not accept standard arguments

query('authorList', [Author]) {
  dataFetcher(new EntityDataFetcher<List<Author>>(Author.gormPersistentEntity) {
    @Override
    protected DetachedCriteria buildCriteria(DataFetchingEnvironment environment) { 
      Author.where {name != 'King'}
    }
  })
}

Results in schema of:

 authorList: [Author]

rather than:

 authorList(
 max: Int
 offset: Int
 sort: String
 order: String
 ignoreCase: Boolean
 ): [Author]

No means for defining field arguments

From the GraphQL spec:

Every field on a GraphQL object type can have zero or more arguments, for example the length field below:

type Starship {
  id: ID!
  name: String!
  length(unit: LengthUnit = METER): Float
}

I was expecting there to be some way similar to defining query operations, a la...

query('authorByName', Author) {
    argument('name', String) 
    ...
}

but there doesn't appear to be any way to define arguments for fields.

The only workaround I can see is to define another query operation, but then you lose the context of the "source" (parent) object, and at that point it largely defeats the purpose of using GraphQL because you're having to make multiple queries to retrieve the same data that should otherwise be retrievable in a single query.

Excluding an association enables all operations by default

When a domain class includes a Map property, the user must either exclude it or manually define how it is mapped (e.g. https://grails.github.io/gorm-graphql/snapshot/guide/index.html#otherNotes)

Excluding it though automatically enables all operations on the given class. If you don't want any of those operations, you're left with doing something like this:

static graphql = GraphQLMapping.build {
        exclude 'coordinates'
        operations.get.enabled false
        operations.list.enabled false
        operations.count.enabled false
        operations.create.enabled false
        operations.delete.enabled false
        operations.update.enabled false
}

See the example at https://github.com/jamesdh/gorm-graphql-bug/blob/master/grails-app/domain/com/bugz/Address.groovy#L15-L23

Kinda verbose/ugly. Would be nice if there were a cleaner way to handle this.

Update Credentials- Publishing Docs is failing

Following is the error snippet which indicates authentication failure:

[gh-pages 58a36da] Updating GraphQL Docs for Travis build: https://travis-ci.org/grails/gorm-graphql/builds/666895817
1437 180 files changed, 1068 insertions(+), 562 deletions(-)
1438remote: Invalid username or password.
1439fatal: Authentication failed for 'https://[secure]@github.com/grails/gorm-graphql.git/'
1440The command "./travis-build.sh" exited with 0.

see Complete Build Log for more details.

Grails 3.2.10 application won't start with this plugin

Including this plugin in a Grails 3.2.10 application via:

compile "org.grails.plugins:gorm-graphql:1.0.0"

causes the following error on startup:

Caused by: java.lang.ClassNotFoundException: org.grails.compiler.web.converters.RenderConverterTrait

DefaultGormDataFetcher does not work for domains with not default datastore

If I define domain with not default datastore like:

class Speaker {

    String firstName
    String lastName
    String name
    String email
    String bio

    static graphql = GraphQLMapping.build {
        operations.delete.enabled false
        //or
        //operations.get
        //operations.list
        //operations.count
        //operations.create
        //operations.update
        //operations.delete
    }

    static constraints = {
        email nullable: true, email: true
        bio nullable: true
    }

    static mapping = {
        datasource "rimm"  // <------ here

        bio type: 'text'
        name formula: 'concat(FIRST_NAME,\' \',LAST_NAME)'
        talks sort: 'id'
    }

}

I am getting error like:

curl -X "POST" "http://localhost:8080/graphql" \                                                                                                52 ↵  
     -H "Content-Type: application/graphql" \
     -d $'
{
  speakerCount
}'
{"data":{"speakerCount":null},"errors":[{"message":"Exception while fetching data (/speakerCount) : Class org.grails.gorm.graphql.fetcher.DefaultGormDataFetcher can not access a member of class org.grails.orm.hibernate.HibernateDatastore$2 with modifiers \"public volatile\"","errorType":"DataFetchingException","locations":[{"line":3,"column":3}]}]}

Support modifying the default operation names

Because we may be burdened with domain models that are either poorly or lengthily named, it would be helpful to have the ability to provide custom operation names in the GraphQLMapping DSL.

I've already actually implemented this, just need to submit a PR for it.

Additional filtering parameters when adding a custom property to a domain class

Hi!

I have class Foo with custom property bar.

 class Foo {
     static graphql = GraphQLMapping.build {
         add('bar', Bar) {
             dataFetcher { Foo foo, ClosureDataFetchingEnvironment env ->
                 //The fetchArguments will be populated based on what properties
                 //were requested from the 'bar'
                 Bar.where { .list(env.fetchArguments)
             }
         }
     }
 }
 }

like in this example https://grails.github.io/gorm-graphql/snapshot/api/org/grails/gorm/graphql/fetcher/impl/ClosureDataFetchingEnvironment.html

And domain class Bar contains property baz. So I try to filter by this parameter baz

{
  foo(id: 1000) {
    id
    bar (baz: "bla") {
      id
    }
  }
}

but I'm getting an error: Validation error of type UnknownArgument: Unknown field argument baz
What I'm doing wrong? Please help

Update to graphql-java 13.0

Currently gorm-graphql is using older graphql-java v11 which contains deprecated approach of adding dataFetcher(e.g) to the field definition, instead it should be migrated to the GraphQLCodeRegistry . Also in DataFetchingEnvironment was deprecated getFields which is used in EntityFetchOptions.

Circular association intermittently fails schema generation

Related to #7

When using a circular association (in my example via one-to-many association), schema generation will fail ~50% of the time on startup:

class User {
    Address address
    static constraints = {
        address nullable: true
    }
    static graphic = true
}

class Address {
    Set<User> owners
    static hasMany = [
        owners: User
    ]
}

results in...

Caused by: graphql.AssertException: type Address not found in schema
	at graphql.Assert.assertNotNull(Assert.java:13)
	at graphql.schema.GraphQLTypeResolvingVisitor.visitGraphQLTypeReference(GraphQLTypeResolvingVisitor.java:42)
	at graphql.schema.GraphQLTypeReference.accept(GraphQLTypeReference.java:45)
	at graphql.schema.TypeTraverser$TraverserDelegateVisitor.enter(TypeTraverser.java:73)
	at graphql.util.Traverser.traverse(Traverser.java:106)
	at graphql.schema.TypeTraverser.doTraverse(TypeTraverser.java:60)
	at graphql.schema.TypeTraverser.depthFirst(TypeTraverser.java:52)
	at graphql.schema.TypeTraverser.depthFirst(TypeTraverser.java:40)
	at graphql.schema.SchemaUtil.replaceTypeReferences(SchemaUtil.java:106)
	at graphql.schema.GraphQLSchema$Builder.build(GraphQLSchema.java:341)
	at graphql.schema.GraphQLSchema$Builder.build(GraphQLSchema.java:314)
	at org.grails.gorm.graphql.Schema.generate(Schema.groovy:446)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)

I've include a full project reproducing this at https://github.com/jamesdh/gorm-graphql-bug. Either running the app or running integration tests should reproduce it ~50% of the time.

ClosureDataFetchingEnvironment's fetchArguments is always empty

When defining a custom property/field, the docs say we can use the provided fetchArguments for retrieving the fetch options or the list of join properties. However, it's perpetually empty, and hence we lose out on the automatic join operations.

Oddly enough, the test for this functionality appears to actually confirm this:

when:
def resp = graphQL.graphql("""
{
tag(id: ${grailsId}) {
id
name
posts {
id
tags {
name
}
}
}
}
""")
Map obj = resp.body().data.tag
then:
//queries.size() == 2 ignored due to GORM issue https://github.com/grails/grails-data-mapping/issues/989
queries[0] ==~ 'Hibernate: select this_.id as id[0-9]+_[0-9]+_[0-9]+_, this_.version as version[0-9]+_[0-9]+_[0-9]+_, this_.name as name[0-9]+_[0-9]+_[0-9]+_ from tag this_ where this_.id=\\? limit \\?\n'
queries[1] ==~ 'Hibernate: select this_.id as id[0-9]+_[0-9]+_[0-9]+_, this_.version as version[0-9]+_[0-9]+_[0-9]+_, this_.title as title[0-9]+_[0-9]+_[0-9]+_, this_.date_created as date_cre[0-9]+_[0-9]+_[0-9]+_, this_.last_updated as last_upd[0-9]+_[0-9]+_[0-9]+_, tags3_.post_tags_id as post_tag[0-9]+_[0-9]+_, tags_alias1_.id as tag_id[0-9]+_[0-9]+_, tags_alias1_.id as id[0-9]+_[0-9]+_[0-9]+_, tags_alias1_.version as version[0-9]+_[0-9]+_[0-9]+_, tags_alias1_.name as name[0-9]+_[0-9]+_[0-9]+_ from post this_ inner join post_tag tags3_ on this_.id=tags3_.post_tags_id inner join tag tags_alias1_ on tags3_.tag_id=tags_alias1_.id where tags_alias1_.id=\\?\n'

If you look at the second query, you can see it queried for more properties than were specified in the original query, and if you debug the actual test, you'll see that env.fetchArguments is always an empty Map. Hence the test is incorrect, given the actually expected behavior.

It appears this is the root cause:

if (properties.isEmpty()) {
return new LinkedHashMap<>();
}

So either that is intended (and arguably not very useful) and the docs are misleading, or the docs are correct and this is actually not functioning as intended.

There is no GrailsGraphQLDataBinder in Standalone Projects, and Nested properties will not be set

my code

Problem

when I create Talk(as same as example project):

  • speaker with given id is exist
mutation {
  talkCreate(talk: {title: "new talk", duration: 20, speaker: {id: "6bd39acb-c4b6-46b2-a564-5779d75cee2d"}}) {
    id
    title
    duration
    errors {
      field
      message
    }
  }
}

return error

{
  "data": {
    "talkCreate": {
      "id": null,
      "title": "new talk",
      "duration": 20,
      "errors": [
        {
          "field": "speaker",
          "message": "Property [speaker] of class [class neo.script.gorm.graphql.demo.domain.Talk] cannot be null"
        }
      ]
    }
  }
}

my analyze

  1. Without org.grails.gorm.graphql.plugin.binding.GrailsGraphQLDataBinder, speaker(id:1) do not set for Talk.

Will you solve this problem?

Error building docs

* What went wrong:
Some problems were found with the configuration of task ':docs:publishGuide' (type 'PublishGuide').
  - Type 'grails.doc.gradle.PublishGuide' property 'asciidoc' has redundant getters: 'getAsciidoc()' and 'isAsciidoc()'.
    
    Reason: Boolean property 'asciidoc' has both an `is` and a `get` getter.
    
    Possible solutions:
      1. Remove one of the getters.
      2. Annotate one of the getters with @Internal.
    
    Please refer to https://docs.gradle.org/7.6.3/userguide/validation_problems.html#redundant_getters for more details about this problem.
  - Type 'grails.doc.gradle.PublishGuide' property 'asciidoc' of type boolean shouldn't be annotated with @Optional.
    
    Reason: Properties of primitive type cannot be optional.
    
    Possible solutions:
      1. Remove the @Optional annotation.
      2. Use the java.lang.Boolean type instead.
    
    Please refer to https://docs.gradle.org/7.6.3/userguide/validation_problems.html#cannot_use_optional_on_primitive_types for more details about this problem.
  - Type 'grails.doc.gradle.PublishGuide' property 'macros' is missing an input or output annotation.
    
    Reason: A property without annotation isn't considered during up-to-date checking.
    
    Possible solutions:
      1. Add an input or output annotation.
      2. Mark it as @Internal.
    
    Please refer to https://docs.gradle.org/7.6.3/userguide/validation_problems.html#missing_annotation for more details about this problem.
  - Type 'grails.doc.gradle.PublishGuide' property 'workDir' is missing an input or output annotation.
    
    Reason: A property without annotation isn't considered during up-to-date checking.
    
    Possible solutions:
      1. Add an input or output annotation.
      2. Mark it as @Internal.
    
    Please refer to https://docs.gradle.org/7.6.3/userguide/validation_problems.html#missing_annotation for more details about this problem.

Unable to register custom output object type

Working through the docs on Type Conversion and Creation I thought it would be fairly straight forward to register a custom output object (non-scalar) type that isn't a persistent entity. However, I'm not sure it's possible given how the Typed trait resolves output types.

else if (typeManager.hasType(type)) {
graphQLType = (GraphQLInputType)typeManager.getType(type, nullable)
}
else {
PersistentEntity entity = mappingContext?.getPersistentEntity(type.name)
if (entity != null) {
if (propertyType.operationType == GraphQLOperationType.OUTPUT) {
graphQLType = typeManager.getQueryType(entity, propertyType)
}
else {
graphQLType = typeManager.getMutationType(entity, propertyType, nullable)
}
}
else {
throw new TypeNotFoundException(type)
}
}

As you can see in line 55/56, it tries to retrieve it and typecast it as a GraphQLInputType, resulting in...

GroovyCastException: Cannot cast object 'GraphQLObjectType{...}' with class 'graphql.schema.GraphQLObjectType' to class 'graphql.schema.GraphQLInputType'

Mostly just creating this as a reminder to myself to submit a fix, but would appreciate any insights others might have in case I'm missing something obvious.

Documentation for 2.0.1 is not published correctly

  1. The latest documentation should point to 2.0.1 whereas it is pointing to 2.0.0.
  2. https://grails.github.io/gorm-graphql/2.0.1/guide/index.html is displaying Not Found and it seems that the docs are published under hibernate folder so the working link is https://grails.github.io/gorm-graphql/2.0.1/hibernate/guide/index.html. I think there may be some issues with Java CI Workflow configuration.
  3. The Quick Reference options are not display for 2.0.1 version of documentation.

I think all these problems might be inter-related to each other.

Nullable property-constraint ignored

Hi!
I set up an example Grails Application project following this guide, however when setting the firstName property as not nullable this constraint is not respected, GraphiQL displays it as a nullable field in the SpeakerCreate type.

static constraints = {
  firstName nullable: false
  email nullable: true, email: true
  bio nullable: true
}

static graphql = GraphQLMapping.build {
  property('firstName',
    [
      order      : 2,
      description: 'Author first name'
      nullable: false'
    ])
}

image

Only if I remove the entire property mapping is the nullable constraint respected, but this prevents me from mapping the property with a custom order and description.

static constraints = {
  firstName nullable: false
  email nullable: true, email: true
  bio nullable: true
}

static graphql = GraphQLMapping.build {
  /*property('firstName',
    [
      order      : 2,
      description: 'Author first name'
      nullable: false'
    ])*/
}

image

Thanks in advance

Feature request: ability to reuse nested POGO on multiple domain classes without gql type DSL duplication

I have a class with multiple layers of nesting that I would like to attach to the graphql queries for many domain classes (i.e. a good use-case for add())

I didn't make this POGO a domain class, because the whole thing is read-only (no DB persistence) and built at query-time.

This means I need to declare my gql types manually instead of automatically by the plugin (fine), but I'm hoping to colocate the gql type markup and properties on the nested classes, and keep my code DRY.

However, because of the nesting on the POGO, I couldn't find a way to make re-use of the whole class without declaring the full gql type markup on each domain class.

I have created a repo showing this: https://github.com/brdbry/gorm-graphql-nested-pogo

See the IncomingIntercoDrawdown and OutgoingIntercoDrawdown domain classes for an example.

Would it be possible to allow some way of achieving nesting POGOs in the plugin e.g. some GQL type name suffix parameter that can be passed in when defining the type at the top level?

Failing that, can you think of an alternative design pattern I could use instead?
Alternative solutions considered and failed already (though I may have done something wrong):

  • Set a variable in the top level scope (like gqlTypeNameQualifier); but the closure resolution strategy for the closures are explicitly set to DELEGATE_ONLY by the plugin, removing the ability to read owner variables
  • Make the nested class a domain class but switch off persistence (I tried this with mapWith = 'none' and it didn't work, but I just saw isAttached() approach here (https://stackoverflow.com/questions/3490135/do-grails-domain-classes-have-to-be-tied-to-a-database) so I'll try that too).
  • Find and rename the types in LeafGraphQLSchemaInterceptor; but the GraphQLObjectType properties are read-only, and the GraphQLFieldDefinition.Builder only seems to allow top-down construction of a field hierarchy (not targeted swap-out)

Thanks in advance.

Feature request: Authentication support for integration test using GraphQLSpec trait

Using Spring Security together with GORM GraphQL we want to be able to add authentication headers in our integration tests to validate our app security, data integrity and tenancy that has been setup with GraphQL interceptors and Spring Security configuration.

This can be done by attaching GET parameter /graphql?access_token=XXX or allowing developer to add HTTP headers to RxHttpClient.

Graphql on a @GrailsCompileStatic domain class cause nullable constraint to be ignored

If you have a domain class that is marked with @GrailsCompileSatic and this class has a property with a constraint nullable: true, and if this class is enabled for GraphQL with a custom operation/query, then the nullable: true constraint behaves like nullable: false.

Steps to reproduce:

  1. Create a new project (Tested with Grails 4.0.4 / 4.0.5 and their default gorm version)
    Add compile "org.grails.plugins:gorm-graphql-plugin:2.0.0" dependency

  2. Create a domain class, say MyDomain marked with @GrailsCompileStatic and a nullable property, like:

@GrailsCompileStatic
class MyDomain {
    String name

    static constraints = {
        name nullable: true
    }
}
  1. Add a custom GraphQL mapping which defines a simple query:
@GrailsCompileStatic
class MyDomain {
    String name

    static constraints = {
        name nullable: true
    }

    static graphql = GraphQLMapping.build {
        query("myQuery", Integer) {
            dataFetcher(new DataFetcher() {
                @Override
                Object get(DataFetchingEnvironment environment) throws Exception {
                    return new Integer(0)
                }
            })
        }
    }
}

If you just put static graphql=true or static graphql = GraphQLMapping.build {} there's no issue.

  1. Now in BootStrap, you just create and save a new instance of that class leaving the nullable field empty, like:
class BootStrap {

    def init = { servletContext ->
        new MyDomain().save(failOnError: true)
    }
    def destroy = {
    }
}
  1. Now you run with gradlew bootRun. It is expected the instance to be persisted with no errors, because it has only one field, which is null, and that field allows null. Instead, you see a validation exception:
grails.validation.ValidationException: Validation Error(s) occurred during save():
- Field error in object 'test.MyDomain' on field 'name': rejected value [null]; codes [test.MyDomain.name.nullable.error.test.MyDomain.name,test.MyDomain.name.null
able.error.name,test.MyDomain.name.nullable.error.java.lang.String,test.MyDomain.name.nullable.error,myDomain.name.nullable.error.test.MyDomain.name,myDomain.name.
nullable.error.name,myDomain.name.nullable.error.java.lang.String,myDomain.name.nullable.error,test.MyDomain.name.nullable.test.MyDomain.name,test.MyDomain.name.nu
llable.name,test.MyDomain.name.nullable.java.lang.String,test.MyDomain.name.nullable,myDomain.name.nullable.test.MyDomain.name,myDomain.name.nullable.name,myDomain
.name.nullable.java.lang.String,myDomain.name.nullable,nullable.test.MyDomain.name,nullable.name,nullable.java.lang.String,nullable]; arguments [name,class test.My
Domain]; default message [O campo [{0}] da classe [{1}] nÒo pode ser vazio]

        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:80)
        at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:74)
        at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1732)
        at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1556)
        at org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:1042)
        at org.codehaus.groovy.runtime.DefaultGroovyMethods.newInstance(DefaultGroovyMethods.java:17159)
        at org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:134)
        at org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:153)
        at test.MyDomain.save(MyDomain.groovy)
        at test.MyDomain.save(MyDomain.groovy)
        at org.grails.datastore.gorm.GormEntity$save.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
        at testconstraintnotnull.BootStrap$_closure1.doCall(BootStrap.groovy:10)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:101)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1099)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1041)
        at groovy.lang.Closure.call(Closure.java:405)
        at groovy.lang.Closure.call(Closure.java:399)
        at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:594)
        at grails.util.Environment.executeForEnvironment(Environment.java:587)
        at grails.util.Environment.executeForCurrentEnvironment(Environment.java:563)
        at org.grails.web.servlet.boostrap.DefaultGrailsBootstrapClass.callInit(DefaultGrailsBootstrapClass.java:74)
        at org.grails.web.servlet.context.GrailsConfigUtils.executeGrailsBootstraps(GrailsConfigUtils.java:83)
        at org.grails.plugins.web.servlet.context.BootStrapClassRunner.onStartup(BootStrapClassRunner.groovy:56)
        at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy:269)
        at grails.boot.config.GrailsApplicationPostProcessor.onApplicationEvent(GrailsApplicationPostProcessor.groovy)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
        at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403)
        at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360)
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:99)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:485)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:472)
        at testconstraintnotnull.Application.main(Application.groovy:11)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)

Now if you either remove @GrailsCompileStatic or remove the custom query or remove graphql at all, the app just runs

I uploaded a semple here

Build configuration not working with a default application forge project

Heya, I'm trying to take an old grails 3 app using the graphql plugin and update it to a current app generated with the defaults (grails 5.2.5 web profile) of application forge without success.

Here is a link to the project with a single domain class
https://github.com/Cortrah/gql-plugin-test

The instructions say to add this to the depedencies
compile "org.grails.plugins:gorm-graphql-plugin:2.0.0"

Apparently changes in gradle seem to imply that this should now be
compileOnly "org.grails.plugins:gorm-graphql-plugin:2.0.0"

I've also tried this slightly later version without success
compileOnly "org.grails.plugins:gorm-graphql-plugin:2.0.2.BUILD-SNAPSHOT"

The basic web scaffolding works for the domain class, just not the graphql endpoint or the graphiql link.

looking at the installed plugins list from the home page doesn't list the graphql plugin
and
http://localhost:8080/graphql/browser returns a 404

Any thoughts or directions for me to investigate would be appreciated.

Thanks!

CVE-2023-28867 and CVE-2022-37734

gorm-graphql 2.0.1 pulls in graphql-java 14.1 which has multiple CVEs against it.

Even on the 3.0.x branch, it still only pulls in graphql-java 17.3 which still has the 2023 CVE against it.

Unfortunately here are breaking changes between graphql-java 14.x and the versions needed to fix these vulnerabilities, so forcing the version difference doesn't seem to be an option.

Querying an association that consists of an inheritance hierarchy fails due to Hibernate Proxies

This easily happens when the inheritance hierarchy in question is an association on a parent domain model that is being queried. If the object is not already in Hibernates cache, it generates a proxy for it when being retrieved, but then GraphQL is unable to adequately determine its type when fulfilling the query.

Adding this mostly as a placeholder/reminder to submit a PR that clarifies this gotcha in the docs.

Quoting keys in JSON argument of mutation

Heya. I've been pulling together a really trivial example project that demonstrates a custom operation on a grails 4.0.0 app - with the hope of submitting some doc improvements and suggesting we use this lib in a service. Demo/test project is here: https://github.com/ianibo/graphql_grails4_test. and you can recreate this case by checking that out; using grails (4.0.0) run-app and then running the script test_api.sh at the root of the project in a different shell. Had a few stumbles along the way but almost there now and having loads of fun. Just one real headache left: In my test script if I submit a mutation as follows:

curl -X "POST" "http://localhost:8080/graphql" \
     -H "Content-Type: application/graphql" \
     -d $'
mutation {
  widgetCreate(widget: {
    name: "AATestWidget",
    description: "AATestWidget Description"
  }) {
    id
    name
    description
    errors {
      field
      message
    }
  }
}
'

Everything works great - but in trying to use this code in a test harness, I'd like to generate the value of the widget argument using some other libraries. Specifically, I'd like to use groovy.json.JsonOutput to render a map as JSON and then use that JSON a the mutation parameter. The only problem is that groovy.json.JsonOutput insists on quoting it's keys, so what gets sent in this case is

  mutation {
      widgetCreate(widget: {
        "name": "AATestWidget",
        "description": "AATestWidget Description"
      }) {
        id
        name
        description
        errors {
          field
          message
        }
      }
    }

Sending this, however, always results in

{"data":null,"errors":[{"message":"Invalid Syntax : offending token '"name"' at line 4 column 5","errorType":"InvalidSyntax","locations":[{"line":4,"column":5}]}]}

In reading the docs at https://graphql.org/learn/queries/ it seems that it's OK for the content of the argument to be well-formed JSON. Is there any way to either enable sending a well-formed JSON parameter within the body of the argument or have I missed any more obvious way of achieving this (Or just misunderstood what is going on here)?

Cheers in advance,
Ian.

More efficient custom dataFetchers by passing along DetachedCriteria

Currently, if you supply your own dataFetcher for a given field, the GORM database query gets delineated at the point of that dataFetcher. The original query is executed as if the custom dataFetcher was not even provided (to the extent that the fields being queried were already part of the graph), and then any queries performed within the custom dataFetcher are executed in addition to that.

In the case of a deep object graph, with 1-to-Many associations and with potentially multiple custom dataFetchers, this becomes inefficient very quickly. It should be possible that instead we simply pass the unexecuted DetachedCriteria along to a deeper custom dataFetcher. That in turn could use DetachedCriteria's query composition abilities to modify the original query, so on and so forth, ultimately resulting in one single, efficient query.

Multiple Datasources issue

There is some problems to work with multiple datasources(for example MySQL and MongoDB). I've made local fix that plugin generate schema for both datasources. But there is an big work to add return type from one datasources to another. Are you working on it or maybe I should make a pull request?

Grails applications using this plugin and built via 'gradlew war' are not including all required resources

In my application that uses this plugin I am packaging it via Gradle.
Packaged via gradlew war results in these jars getting added to WEB-INF/lib:

-rw-r--r--    1 user1  group1   374K Mar 12 10:31 gorm-graphql-1.0.2.jar
-rw-r--r--    1 user1  group1   647K Dec 20 10:26 graphql-java-6.0.jar

When deploying the Gradle built warfile I get the following error:

ERROR g.b.c.GrailsApplicationPostProcessor Error loading spring/resources.groovy file: org/grails/gorm/graphql/plugin/GraphQLPostProcessor
java.lang.NoClassDefFoundError: org/grails/gorm/graphql/plugin/GraphQLPostProcessor

Packaging via grails war results in these jars getting added to WEB-INF/lib:

-rw-r--r--    1 user1  group1   557K Mar 12 10:31 gorm-graphql-1.0.2.jar
-rw-r--r--    1 user1  group1   647K Dec 20 10:26 graphql-java-6.0.jar
-rw-r--r--    1 user1  group1   374K Mar  8 19:09 org.grails-gorm-graphql-1.0.2.jar
-rw-r--r--    1 user1  group1   557K Mar  8 19:09 org.grails.plugins-gorm-graphql-1.0.2.jar

The missing resource is in the gorm-graphql-1.0.2.jar file If and Only If it's build via grails.
I believe there is an incorrect dependency in the plugin that is preventing is from being built via 'gradlew'.

StackOverflow on nested domainclass with self referencing children.

Given:

class Bar{
   Foo foo
   static graphql = true
}
class Foo{
   static hasMany = [items:FooItem]
}
class FooItem{
   static belongsTo = [foo:Foo]
}

This will throw a StackOverflowError, it tries to create reference from Foo to FooItem and back.
Adding static graphql = true to Foo solves this, because then there's a mapping available and a reference will be created.

If this is not supported a warning could be logged?

Custom Data Fetcher in gorm-graphql 2.0.0 + MultiTenancy project - Fails Startup

heya - 2.0.0 looks really good and MultiTenancy support is definitely better - out of the box confirmed working with Database-Per-Tenant mappings too - so that's great.

Trying to add in a custom data fetcher when working in Multi-Tenancy mode seems to encounter a similar problem to v1 with static access at applicaiton startup:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'graphQL': Cannot resolve reference to bean 'graphQLSchema' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'graphQLSchema': Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [graphql.schema.GraphQLSchema]: Factory method 'generate' threw exception; nested exception is org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException: Tenant could not be resolved outside a web request

The project works perfectly with the out-of-the-box config until we declare a custom fetcher (Simplified example):

static graphql = GraphQLMapping.lazy {
  query('generalAlertBaseQuery', pagedResult(AlertBase)) {
    defaultListArguments()
    argument('qterm', String) {
      nullable true
      description "Left anchored alert name to search for"
    }
    dataFetcher(new PaginatedEntityDataFetcher<List<AlertBase>>(AlertBase.gormPersistentEntity)     {
      @Override
      protected DetachedCriteria buildCriteria(DataFetchingEnvironment environment) {
        def q = new DetachedCriteria(AlertBase).build {
          rlike('name',/${environment.getArgument('qterm')}/)
        }
        return q
      }
    })
  }
}

This code is yanked directly from a v1 test rig, and I've only scanned over the updated 2.0.0 docs so apologies if I've missed something critical.

Is it possible that custom fetchers can be made to work in the multi-tenant setup? WIll try and update the test project to recreate this in a simple env.

Error exist in bytecode in Grails 4 using grapqhl property

Currently I get Error exist in bytecodeerrors in any Grails 4 sample apps if I use grapqhl in any domain class.

An easy way to reproduce it is to run:

./gradlew :examples-grails-docs-app:integrationTest --tests demo.SpeakerIntegrationSpec

This is a sample stacktrace:


org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodValidationPostProcessor' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Unsatisfied dependency expressed through method 'methodValidationPostProcessor' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:228)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at grails.boot.GrailsApp.run(GrailsApp.groovy:93)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:127)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:43)
	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:97)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:475)
	at org.spockframework.runtime.BaseSpecRunner.runInitializer(BaseSpecRunner.java:341)
	at org.spockframework.runtime.BaseSpecRunner.runInitializer(BaseSpecRunner.java:336)
	at org.spockframework.runtime.BaseSpecRunner.initializeAndRunIteration(BaseSpecRunner.java:274)
	at org.spockframework.runtime.BaseSpecRunner.runSimpleFeature(BaseSpecRunner.java:266)
	at org.spockframework.runtime.BaseSpecRunner.doRunFeature(BaseSpecRunner.java:260)
	at org.spockframework.runtime.BaseSpecRunner$5.invoke(BaseSpecRunner.java:243)
	at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:484)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:467)
	at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:235)
	at org.spockframework.runtime.BaseSpecRunner.runFeatures(BaseSpecRunner.java:185)
	at org.spockframework.runtime.BaseSpecRunner.doRunSpec(BaseSpecRunner.java:95)
	at org.spockframework.runtime.BaseSpecRunner$1.invoke(BaseSpecRunner.java:81)
	at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:484)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:467)
	at org.spockframework.runtime.BaseSpecRunner.runSpec(BaseSpecRunner.java:73)
	at org.spockframework.runtime.BaseSpecRunner.run(BaseSpecRunner.java:64)
	at org.spockframework.runtime.Sputnik.run(Sputnik.java:63)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:676)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:188)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:974)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:848)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:574)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:514)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:477)
	at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:227)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1401)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1200)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
	... 76 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:304)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367)
	... 92 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
	... 102 common frames omitted
Caused by: java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.getDeclaredMethods(Class.java:1975)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:108)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:106)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getDeclaredMethods(CachedSAMClass.java:106)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getAbstractMethods(CachedSAMClass.java:124)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethodImpl(CachedSAMClass.java:198)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethod(CachedSAMClass.java:165)
	at org.codehaus.groovy.reflection.ClassInfo.isSAM(ClassInfo.java:405)
	at org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:395)
	at org.codehaus.groovy.reflection.ClassInfo.access$300(ClassInfo.java:75)
	at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:453)
	at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:443)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:164)
	at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:95)
	at org.codehaus.groovy.reflection.ParameterTypes.getParametersTypes0(ParameterTypes.java:85)
	at org.codehaus.groovy.reflection.ParameterTypes.getParameterTypes(ParameterTypes.java:67)
	at org.codehaus.groovy.reflection.CachedMethod.compareToCachedMethod(CachedMethod.java:167)
	at org.codehaus.groovy.reflection.CachedMethod.compareTo(CachedMethod.java:150)
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.util.ComparableTimSort.sort(ComparableTimSort.java:202)
	at java.util.Arrays.sort(Arrays.java:1246)
	at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:155)
	at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:119)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:302)
	at groovy.lang.MetaClassImpl.populateMethods(MetaClassImpl.java:403)
	at groovy.lang.MetaClassImpl.fillMethodIndex(MetaClassImpl.java:353)
	at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3329)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:289)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:331)
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:271)
	at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:969)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:74)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:161)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at demo.Author.<clinit>(Author.groovy:23)
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
	at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:156)
	at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
	at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
	at java.lang.reflect.Field.get(Field.java:393)
	at org.codehaus.groovy.reflection.CachedField.getProperty(CachedField.java:55)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:224)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:205)
	at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:94)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext$HibernateMappingFactory.createIdentityMapping(HibernateMappingContext.java:231)
	at org.grails.datastore.mapping.model.config.GormMappingConfigurationStrategy.getIdentityMapping(GormMappingConfigurationStrategy.java:928)
	at org.grails.datastore.mapping.model.config.JpaMappingConfigurationStrategy.getIdentityMapping(JpaMappingConfigurationStrategy.java:289)
	at org.grails.datastore.mapping.model.AbstractClassMapping.<init>(AbstractClassMapping.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity$1.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.createPersistentEntity(HibernateMappingContext.java:108)
	at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntities(AbstractMappingContext.java:274)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.<init>(HibernateMappingContext.java:73)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.buildConfiguration(HibernateConnectionSourceFactory.java:94)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:85)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52)
	at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24)
	at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:200)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
	... 104 common frames omitted

2019-01-03 07:49:15.578 ERROR --- [    Test worker] o.s.test.context.TestContextManager      : Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@41061388] to prepare test instance [demo.SpeakerIntegrationSpec@3f4582cb]

java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:43)
	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:97)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:475)
	at org.spockframework.runtime.BaseSpecRunner.runInitializer(BaseSpecRunner.java:341)
	at org.spockframework.runtime.BaseSpecRunner.runInitializer(BaseSpecRunner.java:336)
	at org.spockframework.runtime.BaseSpecRunner.initializeAndRunIteration(BaseSpecRunner.java:274)
	at org.spockframework.runtime.BaseSpecRunner.runSimpleFeature(BaseSpecRunner.java:266)
	at org.spockframework.runtime.BaseSpecRunner.doRunFeature(BaseSpecRunner.java:260)
	at org.spockframework.runtime.BaseSpecRunner$5.invoke(BaseSpecRunner.java:243)
	at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:484)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:467)
	at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:235)
	at org.spockframework.runtime.BaseSpecRunner.runFeatures(BaseSpecRunner.java:185)
	at org.spockframework.runtime.BaseSpecRunner.doRunSpec(BaseSpecRunner.java:95)
	at org.spockframework.runtime.BaseSpecRunner$1.invoke(BaseSpecRunner.java:81)
	at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:484)
	at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:467)
	at org.spockframework.runtime.BaseSpecRunner.runSpec(BaseSpecRunner.java:73)
	at org.spockframework.runtime.BaseSpecRunner.run(BaseSpecRunner.java:64)
	at org.spockframework.runtime.Sputnik.run(Sputnik.java:63)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodValidationPostProcessor' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Unsatisfied dependency expressed through method 'methodValidationPostProcessor' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:228)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at grails.boot.GrailsApp.run(GrailsApp.groovy:93)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:127)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
	... 56 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:676)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:188)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:974)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:848)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:574)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:514)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:477)
	at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:227)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1401)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1200)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
	... 76 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:304)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367)
	... 92 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
	... 102 common frames omitted
Caused by: java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at java.lang.Class.getDeclaredMethods0(Native Method)
	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.getDeclaredMethods(Class.java:1975)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:108)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass$1.run(CachedSAMClass.java:106)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getDeclaredMethods(CachedSAMClass.java:106)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getAbstractMethods(CachedSAMClass.java:124)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethodImpl(CachedSAMClass.java:198)
	at org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.getSAMMethod(CachedSAMClass.java:165)
	at org.codehaus.groovy.reflection.ClassInfo.isSAM(ClassInfo.java:405)
	at org.codehaus.groovy.reflection.ClassInfo.createCachedClass(ClassInfo.java:395)
	at org.codehaus.groovy.reflection.ClassInfo.access$300(ClassInfo.java:75)
	at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:453)
	at org.codehaus.groovy.reflection.ClassInfo$LazyCachedClassRef.initValue(ClassInfo.java:443)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at org.codehaus.groovy.reflection.ClassInfo.getCachedClass(ClassInfo.java:164)
	at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:95)
	at org.codehaus.groovy.reflection.ParameterTypes.getParametersTypes0(ParameterTypes.java:85)
	at org.codehaus.groovy.reflection.ParameterTypes.getParameterTypes(ParameterTypes.java:67)
	at org.codehaus.groovy.reflection.CachedMethod.compareToCachedMethod(CachedMethod.java:167)
	at org.codehaus.groovy.reflection.CachedMethod.compareTo(CachedMethod.java:150)
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.util.ComparableTimSort.sort(ComparableTimSort.java:202)
	at java.util.Arrays.sort(Arrays.java:1246)
	at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:155)
	at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:119)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:302)
	at groovy.lang.MetaClassImpl.populateMethods(MetaClassImpl.java:403)
	at groovy.lang.MetaClassImpl.fillMethodIndex(MetaClassImpl.java:353)
	at groovy.lang.MetaClassImpl.initialize(MetaClassImpl.java:3329)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:289)
	at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:331)
	at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.getMetaClass(MetaClassRegistryImpl.java:271)
	at org.codehaus.groovy.runtime.InvokerHelper.getMetaClass(InvokerHelper.java:969)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallStaticSite(CallSiteArray.java:74)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.createCallSite(CallSiteArray.java:161)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:115)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:127)
	at demo.Author.<clinit>(Author.groovy:23)
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
	at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:156)
	at java.lang.reflect.Field.acquireFieldAccessor(Field.java:1088)
	at java.lang.reflect.Field.getFieldAccessor(Field.java:1069)
	at java.lang.reflect.Field.get(Field.java:393)
	at org.codehaus.groovy.reflection.CachedField.getProperty(CachedField.java:55)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:224)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:205)
	at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:94)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext$HibernateMappingFactory.createIdentityMapping(HibernateMappingContext.java:231)
	at org.grails.datastore.mapping.model.config.GormMappingConfigurationStrategy.getIdentityMapping(GormMappingConfigurationStrategy.java:928)
	at org.grails.datastore.mapping.model.config.JpaMappingConfigurationStrategy.getIdentityMapping(JpaMappingConfigurationStrategy.java:289)
	at org.grails.datastore.mapping.model.AbstractClassMapping.<init>(AbstractClassMapping.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity$1.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.createPersistentEntity(HibernateMappingContext.java:108)
	at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntities(AbstractMappingContext.java:274)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.<init>(HibernateMappingContext.java:73)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.buildConfiguration(HibernateConnectionSourceFactory.java:94)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:85)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52)
	at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24)
	at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:200)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
	... 104 common frames omitted


Failed to load ApplicationContext
java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)
	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:108)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:246)
	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:43)
	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:97)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:66)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
	at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
	at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
	at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodValidationPostProcessor' defined in class path resource [org/springframework/boot/autoconfigure/validation/ValidationAutoConfiguration.class]: Unsatisfied dependency expressed through method 'methodValidationPostProcessor' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:769)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:228)
	at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:707)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
	at grails.boot.GrailsApp.run(GrailsApp.groovy:93)
	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:127)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:117)
	... 29 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastoreServiceRegistry': Cannot resolve reference to bean 'hibernateDatastore' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:378)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:110)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:676)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:188)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getSingletonFactoryBeanForTypeCheck(AbstractAutowireCapableBeanFactory.java:974)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:848)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:574)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:514)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:477)
	at org.springframework.beans.factory.BeanFactoryUtils.beanNamesForTypeIncludingAncestors(BeanFactoryUtils.java:227)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1401)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1200)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1164)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
	... 49 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateDatastore': Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:304)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:285)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
	at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:367)
	... 65 more
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.grails.orm.hibernate.HibernateDatastore]: Constructor threw exception; nested exception is java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:184)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:300)
	... 75 more
Caused by: java.lang.VerifyError: Bad invokespecial instruction: interface method reference is in an indirect superinterface.
Exception Details:
  Location:
    org/grails/gorm/graphql/entity/property/impl/CustomGraphQLProperty.org_grails_gorm_graphql_entity_dsl_helpers_Deprecatabletrait$super$getDeprecationReason()Ljava/lang/String; @42: invokespecial
  Reason:
    Error exists in the bytecode
  Bytecode:
    0x0000000: 2ac1 00b1 9900 252a 12b1 b800 3ac0 00b1
    0x0000010: b900 b501 0013 0106 03bd 008d b800 bcb8
    0x0000020: 010c c000 c7b0 0000 bf2a b701 0eb0 00bf
    0x0000030:                                        
  Stackmap Table:
    full_frame(@38,{},{Object[#102]})
    append_frame(@41,Object[#2])
    full_frame(@46,{},{Object[#102]})

	at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
	at java.lang.Class.getDeclaredMethods(Class.java:1975)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.util.ComparableTimSort.sort(ComparableTimSort.java:202)
	at java.util.Arrays.sort(Arrays.java:1246)
	at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:50)
	at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:37)
	at demo.Author.<clinit>(Author.groovy:23)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:224)
	at org.grails.datastore.mapping.reflect.ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(ClassPropertyFetcher.java:205)
	at org.grails.datastore.mapping.config.AbstractGormMappingFactory.createMappedForm(AbstractGormMappingFactory.java:94)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext$HibernateMappingFactory.createIdentityMapping(HibernateMappingContext.java:231)
	at org.grails.datastore.mapping.model.config.GormMappingConfigurationStrategy.getIdentityMapping(GormMappingConfigurationStrategy.java:928)
	at org.grails.datastore.mapping.model.config.JpaMappingConfigurationStrategy.getIdentityMapping(JpaMappingConfigurationStrategy.java:289)
	at org.grails.datastore.mapping.model.AbstractClassMapping.<init>(AbstractClassMapping.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity$1.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernatePersistentEntity.<init>(HibernatePersistentEntity.java:35)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.createPersistentEntity(HibernateMappingContext.java:108)
	at org.grails.datastore.mapping.model.AbstractMappingContext.addPersistentEntities(AbstractMappingContext.java:274)
	at org.grails.orm.hibernate.cfg.HibernateMappingContext.<init>(HibernateMappingContext.java:73)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.buildConfiguration(HibernateConnectionSourceFactory.java:94)
	at org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory.create(HibernateConnectionSourceFactory.java:85)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:39)
	at org.grails.orm.hibernate.connections.AbstractHibernateConnectionSourceFactory.create(AbstractHibernateConnectionSourceFactory.java:23)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:64)
	at org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory.create(AbstractConnectionSourceFactory.java:52)
	at org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer.create(ConnectionSourcesInitializer.groovy:24)
	at org.grails.orm.hibernate.HibernateDatastore.<init>(HibernateDatastore.java:200)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
	... 77 more```

Circular association fail

Reproduce:

class Foo{
     Bar bar 
     static graphql=true
}
class Bar{
    Foo foo 
}

Error:

Caused by: graphql.GraphQLException: type Bar not found in schema
    at graphql.schema.SchemaUtil.resolveTypeReference(SchemaUtil.java:217)
    at graphql.schema.GraphQLFieldDefinition.replaceTypeReferences(GraphQLFieldDefinition.java:50)

Tasklist

  • [ X ] Created fix
  • [ X ] Created test
  • [ ] Issue PR

Multi-Tenant startup - TenantNotFoundException (gorm-graphql 1.0.3-BUILD-SNAPSHOT/Grails 4.0.0)

Hi

Currently looking to see if this plugin might be able to help in a multi-tenant (database schema-per-tenant) microservice component that we would like to transition to graphql.

I'm having a problem using the plugin in our component because the example tenant app uses the SystemPropertyTenantResolver - which means that the example project has a tenant ID in it's hand at application startup time. This in turn means that when the doWithSpring block in GormGraphqlGrailsPlugin.groovy executes the ultimate call to findStaticApi in GormEnhancer can work as in a single tenant environment.

However, in a real multi-tenant scenario (We're using schema-per-tenant, which I suspect might give us a different problem) systems will usually derive the tenant from some property of the request - and as such, the tenant identifier is not available at spring-controlled component init time. The plugin currently fails with the stack-trace at the bottom of this issue when started with a non-test tenant resolver.

I'd like to help resolve this, but could use some advice on the best way forward - I was wondering about a defer option which would delay the call to Schema.generate until the first request came along? Appreciate thats not great for pre-caching the graphql state. Another feature of our environment is that when the app starts we don't have any tenants, although we do have hooks to call functions after new tenants are created (after liquibase migrations have run to create the structure for the tenant). Similarly, I'm not clear yet if all the cached data fetchers will be a problem for us in the (database) Schema-per-tenant environment, and if we really need a (GraphQL) Schema-per-tenant also?

Any thoughts or suggestions? As I said - really happy to try and work through this but need some guidance on where to start.

Cheers.

stacktrace follows::

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'graphQLSchema': Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [graphql.schema.GraphQLSchema]: Factory method 'generate' threw exception; nested exception is org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException: Tenant could not be resolved outside a web request
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1181)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1075)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:84)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:393)
        at grails.boot.GrailsApp.run(GrailsApp.groovy:380)
        at grails.boot.GrailsApp$run.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:136)
        at mod.directory.Application.main(Application.groovy:8)
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [graphql.schema.GraphQLSchema]: Factory method 'generate' threw exception; nested exception is org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException: Tenant could not be resolved outside a web request
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
        ... 23 common frames omitted
Caused by: org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException: Tenant could not be resolved outside a web request
        at com.k_int.okapi.OkapiTenantResolver.resolveTenantIdentifier(OkapiTenantResolver.groovy:65)
        at grails.gorm.multitenancy.Tenants.currentId(Tenants.groovy:73)
        at org.grails.datastore.gorm.GormEnhancer.findTenantId(GormEnhancer.groovy:270)
        at org.grails.datastore.gorm.GormEnhancer.findStaticApi(GormEnhancer.groovy:296)
        at org.grails.gorm.graphql.fetcher.DefaultGormDataFetcher.<init>(DefaultGormDataFetcher.groovy:51)
        at org.grails.gorm.graphql.fetcher.DefaultGormDataFetcher.<init>(DefaultGormDataFetcher.groovy:44)
        at org.grails.gorm.graphql.fetcher.impl.SingleEntityDataFetcher.<init>(SingleEntityDataFetcher.groovy)
        at org.grails.gorm.graphql.Schema.generate(Schema.groovy:266)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1427)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
        ... 24 common frames omitted

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • Update dependency io.micronaut:micronaut-http-client to v3.10.4
  • Update dependency io.projectreactor:reactor-test to v3.6.5
  • Update groovy monorepo to v3.0.21 (org.codehaus.groovy:groovy-groovydoc, org.codehaus.groovy:groovy-cli-picocli, org.codehaus.groovy:groovy-test)
  • Update codenarcVersion to v3.4.0 (codenarc, org.codenarc:CodeNarc)
  • Update dependency com.graphql-java:graphql-java to v20.9
  • Update dependency org.grails:grails-datastore-gorm-mongodb to v7.3.0
  • Update dependency org.grails:grails-gradle-plugin to v6.2.0
  • Update dependency org.spockframework:spock-core to v2.3-groovy-4.0
  • Update dependency com.graphql-java:graphql-java to v230521
  • Update dependency com.graphql-java:graphql-java-extended-scalars to v2023
  • Update dependency io.github.gradle-nexus:publish-plugin to v2
  • Update dependency io.micronaut:micronaut-http-client to v4
  • Update dependency org.grails.plugins:converters to v5
  • Update dependency org.grails:grails-datastore-gorm to v8
  • Update dependency org.grails:grails-datastore-gorm-hibernate5 to v8
  • Update dependency org.grails:grails-datastore-gorm-mongodb to v8
  • Update dependency org.slf4j:slf4j-api to v2
  • Update gradle/gradle-build-action action to v3
  • Update gradle/wrapper-validation-action action to v3
  • Update plugin com.gradle.common-custom-user-data-gradle-plugin to v2
  • Update release-drafter/release-drafter action to v6
  • 🔐 Create all rate-limited PRs at once 🔐

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

github-actions
.github/workflows/gradle.yml
  • actions/checkout v4
  • actions/setup-java v4
  • gradle/gradle-build-action v2
  • actions/checkout v4
  • actions/setup-java v4
  • gradle/gradle-build-action v2
  • gradle/gradle-build-action v2
.github/workflows/release-notes.yml
  • actions/checkout v4
  • release-drafter/release-drafter v5
  • ncipollo/release-action v1
.github/workflows/release.yml
  • actions/checkout v4
  • gradle/wrapper-validation-action v1
  • actions/setup-java v4
gradle
gradle.properties
  • org.grails:grails-gradle-plugin 6.1.1
  • org.grails.plugins:views-gradle 2.3.2
  • org.grails.plugins:views-json 2.3.2
  • com.graphql-java:graphql-java 20.7
  • org.codehaus.groovy:groovy-test 3.0.11
  • org.spockframework:spock-core 2.1-groovy-3.0
  • org.codehaus.groovy:groovy-cli-picocli 3.0.11
  • org.grails:grails-datastore-gorm 7.3.4
  • com.graphql-java:graphql-java-extended-scalars 20.2
  • org.codenarc:CodeNarc 3.3.0
  • org.grails:grails-datastore-gorm-hibernate5 7.3.1
  • org.grails:grails-datastore-gorm-mongodb 7.0.0.RELEASE
  • org.slf4j:slf4j-api 1.7.36
  • codenarc 3.3.0
  • org.codehaus.groovy:groovy-groovydoc 3.0.11
  • javax.servlet:javax.servlet-api 4.0.1
  • io.micronaut:micronaut-http-client 3.10.3
settings.gradle
  • com.gradle.enterprise 3.15.1
  • com.gradle.common-custom-user-data-gradle-plugin 1.12.1
build.gradle
  • io.github.gradle-nexus:publish-plugin 1.3.0
  • io.projectreactor:reactor-test 3.6.1
  • org.grails:grails-datastore-gorm 7.3.4
core/build.gradle
  • com.github.javaparser:javaparser-core 3.25.7
  • org.grails.plugins:views-json 2.3.2
  • org.javassist:javassist 3.29.2-GA
  • com.github.fakemongo:fongo 2.1.1
  • com.h2database:h2 2.2.224
  • org.apache.tomcat:tomcat-jdbc 8.5.97
  • org.apache.tomcat.embed:tomcat-embed-logging-log4j 8.5.2
docs/build.gradle
plugin/build.gradle
  • io.micronaut.rxjava2:micronaut-rxjava2-http-client 1.3.0
  • org.grails.plugins:converters 3.3.1
  • com.github.javaparser:javaparser-core 3.25.7
  • cglib:cglib-nodep 3.3.0
gradle-wrapper
gradle/wrapper/gradle-wrapper.properties
  • gradle 7.6.3

  • Check this box to trigger a request for Renovate to run again on this repository

Auto-reload schema

This plugin is great but it's very painful to restart the application every time we need to make changes to the schema. Would it be possible to regenerate the schema when a change is made?

Cannot globally override DataFetcher's on custom operations/fields/properties

Overriding DataFetcher's currently is only supported on the automatically provided operations, and is not possible on custom operations or fields/properties.

This is cumbersome when dealing with a large object graph where a given entity type might be an associated property in numerous places, and where you want to restrict the data returned for that type, but not have to supply a custom DataFetcher everywhere the type is used.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.