diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/GuiceAopProxyHandler.java b/src/main/kotlin/com/coxautodev/graphql/tools/GuiceAopProxyHandler.java new file mode 100644 index 00000000..d0d023c5 --- /dev/null +++ b/src/main/kotlin/com/coxautodev/graphql/tools/GuiceAopProxyHandler.java @@ -0,0 +1,17 @@ +package com.coxautodev.graphql.tools; + +public class GuiceAopProxyHandler implements ProxyHandler { + @Override + public boolean canHandle(GraphQLResolver resolver) { + return isGuiceProxy(resolver); + } + + @Override + public Class getTargetClass(GraphQLResolver resolver) { + return resolver.getClass().getSuperclass(); + } + + private boolean isGuiceProxy(GraphQLResolver resolver) { + return resolver.getClass().getName().contains("$$EnhancerByGuice$$"); + } +} diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/ResolverInfo.kt b/src/main/kotlin/com/coxautodev/graphql/tools/ResolverInfo.kt index beb0d932..914b609e 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/ResolverInfo.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/ResolverInfo.kt @@ -6,7 +6,7 @@ import java.lang.reflect.ParameterizedType internal abstract class ResolverInfo { abstract fun getFieldSearches(): List - protected fun getRealResolverClass(resolver: GraphQLResolver<*>, options: SchemaParserOptions) = + fun getRealResolverClass(resolver: GraphQLResolver<*>, options: SchemaParserOptions) = options.proxyHandlers.find { it.canHandle(resolver) }?.getTargetClass(resolver) ?: resolver.javaClass } diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaClassScanner.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaClassScanner.kt index 14cbb0c7..6ae59fd9 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaClassScanner.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaClassScanner.kt @@ -169,9 +169,8 @@ internal class SchemaClassScanner(initialDictionary: BiMap>, al } val observedRootTypes = fieldResolvers.filter { it.resolverInfo is RootResolverInfo && it.resolverInfo == rootType.resolverInfo }.map { it.search.type }.toSet() - rootType.resolvers.forEach { resolver -> - if(resolver.javaClass !in observedRootTypes) { + if(rootType.resolverInfo.getRealResolverClass(resolver, options) !in observedRootTypes) { log.warn("Root ${rootType.name} resolver was provided but no methods on it were used in data fetchers for GraphQL type '${rootType.type.name}'! Either remove the ${rootType.resolverInterface.name} interface from the resolver or remove the resolver entirely: $resolver") } } diff --git a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt index d74165ac..08c4aa8a 100644 --- a/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt +++ b/src/main/kotlin/com/coxautodev/graphql/tools/SchemaParserBuilder.kt @@ -234,7 +234,7 @@ data class SchemaParserOptions internal constructor(val genericWrappers: List } - private val proxyHandlers: MutableList = mutableListOf(Spring4AopProxyHandler()) + private val proxyHandlers: MutableList = mutableListOf(Spring4AopProxyHandler(), GuiceAopProxyHandler()) fun genericWrappers(genericWrappers: List) = this.apply { this.genericWrappers.addAll(genericWrappers)