Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Class not found error for scalar type like scalar BigInteger #63

Closed
umesh-kushwaha opened this issue Mar 9, 2021 · 11 comments
Closed

Comments

@umesh-kushwaha
Copy link

Scalar type code generation failed with Class not found error

@srinivasankavitha
Copy link
Contributor

Can you try adding a typeMapping in your codegen config?

generateJava{
   typeMapping = ["MyGraphQLType": "com.mypackage.MyJavaType"]
}

@umesh-kushwaha
Copy link
Author

thanks @srinivasankavitha its working fine. typeMapping=["Long":"java.lang.Long"]

But unit test cases dgsQueryExecutor.executeAndExtractJsonPath() throwing error

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dgsQueryExecutor' defined in com.netflix.graphql.dgs.autoconfig.DgsAutoConfiguration: Unsatisfied dependency expressed through method 'dgsQueryExecutor' parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schema' defined in com.netflix.graphql.dgs.autoconfig.DgsAutoConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [graphql.schema.GraphQLSchema]: Factory method 'schema' threw exception; nested exception is SchemaProblem{errors=[There is no scalar implementation for the named 'Long' scalar type]}

@srinivasankavitha
Copy link
Contributor

Can you try adding the scalar class to the list of test classes specified in @SpringBootTest like this:

@SpringBootTest(classes = {DgsAutoConfiguration.class, YourScalar.class,... })

@umesh-kushwaha
Copy link
Author

I tried and getting error
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'long': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.lang.Long]: No default constructor found; nested exception is java.lang.NoSuchMethodException: java.lang.Long.<init>()

@umesh-kushwaha
Copy link
Author

@srinivasankavitha thanks for looking into the issue. I resolved the issue by loading GraphQLRuntimeWiring class since that’s the one that register all the scalars. We don't need to load every scalar. GraphQLRuntimeWiring class will take care of loading all registered scalars.

@SpringBootTest(classes = {DgsAutoConfiguration.class, GraphQLRuntimeWiring.class,... })

@richardcresswell
Copy link
Contributor

I'm having this same issue with DateTime. I'm adding the scalar class to the list of @SpringBootTest classes. I don't see the GraphQLRuntimeWiring class to add. Any ideas?

java.lang.IllegalArgumentException: Cannot construct instance of java.time.OffsetDateTime (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('2021-04-14T20:17:28.681762Z')

@srinivasankavitha
Copy link
Contributor

What did you add to your list of classes? You do need to set up the scalar class and add it to runtime wiring as shown here:
https://netflix.github.io/dgs/scalars/

@richardcresswell
Copy link
Contributor

Yes, I'm actually using the ExtendedScalars like so:

@DgsComponent
public class DateTimeScalar {
    @DgsRuntimeWiring
    public RuntimeWiring.Builder addScalar(RuntimeWiring.Builder builder) {
        return builder.scalar(ExtendedScalars.DateTime);
    }
}

I also tried the long-form full implementation as shown in the link you sent, but got the same result.

It works fine when running the Application but I can't seem to get it to work in a unit test. I think that it's something along the lines of what @umesh-kushwaha reported originally where it's not being properly registered by the framework, but I can't figure out which class needs to be instantiated. I'm loading the DgsAutoConfiguration.class and my local DateTimeScalar.class.

Thank you for your help!

@richardcresswell
Copy link
Contributor

richardcresswell commented Apr 15, 2021

How does the jackson mapper in DefaultDgsQueryExecutor.kt know about our custom scalar types?

I'm having this problem when I try to deserialize the json back to an object using dgsQueryExecutor.executeAndExtractJsonPathAsObject.

@richardcresswell
Copy link
Contributor

I was able to reproduce this in the java example and created a new issue here.

@srinivasankavitha
Copy link
Contributor

Ok, thanks for the details. Will close this issue in that case and look into the new issue you opened.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants