2
votes

I have a legacy system that I am migrating to Grails 3 but I'm running into a naming convention issue. One of our tables is called Application but that is also the name of the Groovy class that runs the application. There seems to be an issue where GORM is confusing the 2 classes and giving type-casting errors. I have tried explicitly casting my Application class in my ApplicationDegree class to try and force GORM to recognize which class I am trying to use but no success.

I know an option is that I can rename my domain Application class to something else and manually map it to the appropriate database table but I want to avoid that as I foresee issues down the road.

So, other than renaming my Domain classes, how can I get Grails/GORM to make the correct mapping.

Grails 3.1.4

Code:

ApplicationDegree ad = ApplicationDegree.findById(10);

Class:

class ApplicationDegree {

    Boolean isPrimary
    domain.package.Application application
    Degree degree

    static hasMany = [applicationDegreeMajors: ApplicationDegreeMajor,
                      applicationDegreeMinors: ApplicationDegreeMinor]
    static belongsTo = [domain.package.Application, Degree]

    static mapping = {
        version false
        degree column: 'degree_code'
        isPrimary column: 'isPrimary'
    }
}

StackTrace:

ERROR org.grails.spring.beans.factory.OptimizedAutowireCapableBeanFactory - Bean couldn't be autowired using grails optimization: Property 'application' threw exception; nested exception is java.lang.IllegalArgumentException: argument type mismatch
ERROR org.grails.spring.beans.factory.OptimizedAutowireCapableBeanFactory - Retrying using spring autowire
ERROR org.grails.web.errors.GrailsExceptionResolver - IllegalStateException occurred when processing request: [GET] /app4grad_V2/college/applications/
Cannot convert value of type [app4grad.Application] to required type [domain.package.Application] for property 'application': no matching editors or conversion strategy found. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.InstantiationException: Could not instantiate entity:  : domain.package.ApplicationDegree
    at app4grad.college.ApplicationsController$$EPuFyMDe.index(ApplicationsController.groovy:14)
    ... 3 common frames omitted
Caused by: java.lang.reflect.InvocationTargetException: null
    ... 4 common frames omitted
Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type [app4grad.Application] to required type [domain.package.Application] for property 'application'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [app4grad.Application] to required type [domain.package.Application] for property 'application': no matching editors or conversion strategy found
    ... 4 common frames omitted
Caused by: java.lang.IllegalStateException: Cannot convert value of type [app4grad.Application] to required type [domain.package.Application] for property 'application': no matching editors or conversion strategy found
    ... 4 common frames omitted
1
Try using an import instead; add import domain.package.Application and change domain.package.Application to Application inside the classBurt Beckwith
@BurtBeckwith sorry yes I had tried that already but when the import didn't work I had tried a direct typecast. Neither of them work. I had removed it not only because it didn't work, but also because my Intellij IDE said it was an unused import.Raymond Holguin

1 Answers

0
votes

I had the same problem, the problem is that you're using a reserved name : https://grails.org/wiki/Reserved%20Names
Using Intelij Idea you can easily rename you're domain class and the IDE will do the rest for you.