Quantcast

Using critieria within a service class

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Using critieria within a service class

sethfuller
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)
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Using critieria within a service class

sethfuller
I am using Grails 2.0.4.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Using critieria within a service class

OverZealous
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:
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)
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate
star

Re: Using critieria within a service class

sethfuller
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.
Loading...