Grails,如何获取请求对象

Grails,如何获取请求对象,grails,Grails,Grails有一个已定义的请求对象 问题是当我尝试使用它时,我得到: No such property: request for class:xxx 通过谷歌搜索这一错误,阅读前100次点击,只产生了一个建议: import javax.servlet.http.HttpServletRequest import org.springframework.web.context.request.ServletRequestAttributes : def my() { HttpServl

Grails有一个已定义的请求对象

问题是当我尝试使用它时,我得到:

No such property: request for class:xxx
通过谷歌搜索这一错误,阅读前100次点击,只产生了一个建议:

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

groovy.lang.MissingPropertyException: No such property: RequestContextHolder for class: net.ohds.ReportService
  • 如何在Grails中获得请求对象的句柄
  • 你怎么知道的?所以很少有人问过这个问题,它必须记录在某个地方,或者在某个例子中,但我也找不到

  • 我预计您可能会得到“groovy.lang.MissingPropertyException:没有这样的属性:RequestContextHolder for class:net.ohds.ReportService”,因为您没有在ReportService中导入“org.springframework.web.context.request.RequestContextHolder”类

    想要访问请求对象的最常见位置是在控制器中。您只需从控制器中引用
    请求
    属性,它就会出现在那里。看

    如何从其他地方访问请求对象的答案可能取决于“其他地方”是什么

    更新

    我不知道为什么您在将请求从控制器传递到服务时遇到问题,但您可以。我怀疑您错误地调用了该方法,但类似的方法可以工作

    // 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...
        }
    }
    
    控制器

    // grails-app/controllers/com/demo/DemoController.groovy
    package com.demo
    
    class DemoController {
    
        def helperService
    
        def index() {
            helperService.doSomethingWithRequest request
            render 'Success'
        }
    }
    
    请尝试以下代码:

    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()
    

    在Grails 3.0中,从服务获取
    请求
    对象,方法是:

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

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

    注:

    旧的
    codehaus
    包已被弃用。

    好的,我看到了问题,在grails中,请求仅在控制器中可用。我想创建一个返回IP的实用函数。因为只有视图、控制器、域和服务,所以我尝试在服务中使用该实用程序。我尝试将请求传递给服务,但这也不起作用,在服务中我声明“def getIp(HttpServletRequest){”,但随后我得到以下错误:没有方法签名:static net.me.UtilsService.getIp()适用于参数类型:(org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3Security..@JohnLittle)这是一个特殊的声明,但即使我认为这是真的,在Java中对此可以做的任何事情都可以在这里做。你可以在Grails中使用Java。事实证明,Java在这方面没有提供任何特别的东西Groovy无法做到这一点,但如果您想这样做,您可以使用Java。grails中的问题是我不知道任何东西的类型,也找不到它。在这里,我猜请求是HttpServletRequest,但它不是。控制器中可用的东西在其他地方不可用,而要找到如何获得它,则需要非常困难。@JohnLittle
    getIp(HttpServletRequest请求)
    需要
    HttpServletRequest
    但您正在传递
    HttpServlet3RequestFactory$Servlet3‌​安全性
    。您确定它是同一个类吗?@JohnLittle您是否按照Jeff的建议尝试
    在您的服务中导入org.springframework.web.context.request.RequestContextHolder
    ?为什么您希望请求对象在服务中?我也从这里得到了同样的东西