|
I have a criteria query that works fine in my controller, but when I move it to a service class I get an error.
The classes (relevant fields only) are: Domain classes: class Candidate { Firm firm Date expirationDate String status } class Firm { String name } The service method criteria is: class ExpirationService { List getExpiringCandidatesForFirm(Firm firm, Long days = null) { Long expDays = days ?: SEVEN_DAYS List candidateList = null def crit = Candidate.createCriteria() candidateList = crit.list { firm { eq("id", firm.id) } eq("status", Candidate.STATUS_ACTIVE) le("expirationDate", new Date() + 7) } candidateList } } The error is: ERROR org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver - MissingMethodException occurred when processing request: [GET] /lmn-foresthills/secure/candidate/listExpiring No signature of method: com.loudmountain.foresthills.domain.Firm.call() is applicable for argument types: (com.loudmountain.foresthills.services.ExpirationService$_getExpiringCandidatesForFirm_closure4_closure12) values: [com.loudmountain.foresthills.services.ExpirationService$_getExpiringCandidatesForFirm_closure4_closure12@58cdb622] Possible solutions: wait(), save(), any(), getAll(), wait(long), save(boolean). Stacktrace follows: groovy.lang.MissingMethodException: No signature of method: com.loudmountain.foresthills.domain.Firm.call() is applicable for argument types: (com.loudmountain.foresthills.services.ExpirationService$_getExpiringCandidatesForFirm_closure4_closure12) values: [com.loudmountain.foresthills.services.ExpirationService$_getExpiringCandidatesForFirm_closure4_closure12@58cdb622] Possible solutions: wait(), save(), any(), getAll(), wait(long), save(boolean) at com.loudmountain.foresthills.services.ExpirationService$_getExpiringCandidatesForFirm_closure4.doCall(ExpirationService.groovy:96) at grails.orm.HibernateCriteriaBuilder.invokeClosureNode(HibernateCriteriaBuilder.java:1732) at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1446) at com.loudmountain.foresthills.services.ExpirationService.getExpiringCandidatesForFirm(ExpirationService.groovy:95) at com.loudmountain.foresthills.services.ExpirationService.getExpiringCandidates(ExpirationService.groovy:66) at com.loudmountain.foresthills.controllers.CandidateController$$ENc2glzs.listExpiring(CandidateController.groovy:508) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:680) |
|
I am using Grails 2.0.4.
|
|
In reply to this post by sethfuller
At a quick glance, I'd say it's because the local variable on your Service is firm, but your criteria object is also called firm. It looks like it's deferring to the local variable, instead of processing the firm DSL method. A quick fix might be to change your service method to: List getExpiringCandidatesForFirm(Firm givenFirm, Long days = null) { Long expDays = days ?: SEVEN_DAYS List candidateList = null def crit = Candidate.createCriteria() candidateList = crit.list { firm { eq("id", givenFirm.id) } eq("status", Candidate.STATUS_ACTIVE) le("expirationDate", new Date() + 7) } candidateList } (Or change givenFirm to whatever.) - Phil DeJarnett sethfuller wrote:
|
|
That was it. I changed my local variable to aFirm and it works now. Thank you. In my controller I was referring to recruiter.firm so that is why it worked in the controller.
|
| Powered by Nabble | Edit this page |
