Search code examples
grailsgrails-controller

Grails dependency injection from service to controller is not working


As per the grails 3.1.13 guide I am trying to add service dependency to my controller, but somehow it is not working for me. It is throwing NullPointerException for Cannot get property 'serviceMethod' on null object. Below I am mentioning the steps to reproduce.

Execute following commands

grails create-app DepInjectionTest
grails create-controller com.abc.project.KpiReport
grails create-service com.abc.project.KpiReport

Above creates below directory structure enter image description here

KpiReportService

@Transactional
class KpiReportService {

    def serviceMethod() {
        return "Hello from KpiReportService"
    }
}

KpiReportController

class KpiReportController {
    def index() {
        def kpiReportService
        render kpiReportService.serviceMethod
        //render "Hello from KpiReportController"
    }
}

Exception

Grails application running at http://localhost:8080 in environment: development
ERROR org.grails.web.errors.GrailsExceptionResolver - NullPointerException occurred when processing request: [POST] /KpiReport/index
Cannot get property 'serviceMethod' on null object. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
        at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:210)
        at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:187)
        at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
        at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
        at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
        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: java.lang.NullPointerException: Cannot get property 'serviceMethod' on null object
        at com.abc.project.KpiReportController.index(KpiReportController.groovy:7)
        ... 13 common frames omitted

Using postman for request enter image description here

I am new to grails, please help me figure out what is going wrong, may be I am missing something.


Solution

  • Services are injected as class variables

    class KpiReportController {
        def kpiReportService
    
        def index() {
            render kpiReportService.serviceMethod()
            //render "Hello from KpiReportController"
        }
    }