John Little
John Little

Reputation: 12338

Grails, how to get the request object

Grails has a request object which is defined here.

The problem is when I try to use it, I get:

No such property: request for class:xxx

Reading the first 100 hits googling this error only produced one suggestion:

import javax.servlet.http.HttpServletRequest
import org.springframework.web.context.request.ServletRequestAttributes
:
def my() {
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
}

However, this gives:

groovy.lang.MissingPropertyException: No such property: RequestContextHolder for class: net.ohds.ReportService
  1. How does one get a handle on the request object in Grails?
  2. How do you find out about this? So few people have asked this question, it must be documented somewhere, or in some example, but I can't find either.

Upvotes: 11

Views: 13904

Answers (3)

Dem Pilafian
Dem Pilafian

Reputation: 5976

In Grails 3.0, from a service get the request object using:

grails-app/services/com/example/MyService.groovy

import org.grails.web.util.WebUtils
...
def request = WebUtils.retrieveGrailsWebRequest().getCurrentRequest()
def ip = request.getRemoteAddr()

Documentation:
https://docs.grails.org/latest/api/org/grails/web/util/WebUtils.html#retrieveGrailsWebRequest()

Note:
The old codehaus package has been deprecated.

Upvotes: 20

MKB
MKB

Reputation: 7619

Try following code:

import org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequest
import org.codehaus.groovy.grails.web.util.WebUtils

...

GrailsWebRequest webUtils = WebUtils.retrieveGrailsWebRequest()
def request = webUtils.getCurrentRequest()

Upvotes: 9

Jeff Scott Brown
Jeff Scott Brown

Reputation: 27200

I expect that you probably got "groovy.lang.MissingPropertyException: No such property: RequestContextHolder for class: net.ohds.ReportService" because you didn't import the "org.springframework.web.context.request.RequestContextHolder" class in your ReportService.

The most common place to want access to the request object is in a controller. From a controller you simply refer to the request property and it will be there. See http://grails.org/doc/latest/ref/Controllers/request.html.

The answer to how to access the request object from somewhere else may depend on what the somewhere else is.

UPDATE

I don't know why you are having trouble passing the request from a controller to a service, but you can. I suspect you are invoking the method incorrectly, but something like this will work...

// grails-app/services/com/demo/HelperService.groovy
package com.demo

class HelperService {

    // you don't have to statically type the
    // argument here... but you can
    def doSomethingWithRequest(javax.servlet.http.HttpServletRequest req) {
        // do whatever you want to do with req here...
    }
}

A controller...

// grails-app/controllers/com/demo/DemoController.groovy
package com.demo

class DemoController {

    def helperService

    def index() {
        helperService.doSomethingWithRequest request
        render 'Success'
    }
}

Upvotes: 1

Related Questions