2011-08-15 9 views
15

मुझे Grails सत्र में कोई समस्या है। मैं अपने सत्र हैंडलिंग के लिए सर्विस क्लास रखने के बारे में सोच रहा था। इसलिए मैंने "सत्र सेवा" नामक एक कक्षा बनाई (grails-app/services/grails /) के तहत।ग्रेल्स सर्विस क्लास में सत्र और प्रबंधन प्राप्त करते हैं

class SessionService { 
    static transactional = true 
    GrailsWebRequest request = RequestContextHolder.currentRequestAttributes() 
    GrailsHttpSession session = request.session 

    def setTestvar(String value) { 
     if (session != null) 
      session.setAttribute("sTeststring", value) 
    } 

    def getTestvar() { 
     if (session != null) 
      session.getAttribute("sTeststring") 
    } 
} 

समस्या है कि मैं एक Nullpointer-अपवाद मिलता है,:। "विधि फेंक दिया 'java.lang.NullPointerException' अपवाद org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession का मूल्यांकन नहीं कर सकते .ToString() "।

मेरी सेवा कक्षा का उपयोग उदा। एक नियंत्रक में:

class SampleController { 

    SessionService sessionService 

    def selectAnything = { 

     sessionService.setTestvar("test-value") 
     render(view: "testview") 
    } 
} 

मैं यहां क्या गलत कर रहा हूं? क्या यह सही तरीका है? या क्या मुझे हर विधि में "session = request.session" सेट करना है?

आपकी मदद करने की उम्मीद है।

अग्रिम में बहुत बहुत धन्यवाद।

चीयर्स,

मार्को

उत्तर

31

आप अपनी सेवा के हर विधि में तरह

def session = RequestContextHolder.currentRequestAttributes().getSession() 

कुछ करने के लिए। लेकिन यह मुझे स्पष्ट नहीं है, आपको ऐसी सेवा की आवश्यकता क्यों है। आप allways इस तरह अपने नियंत्रक में सत्र का उपयोग कर सकते हैं ...

session.someAttribute = "someValue" 

ईसाई

+1

हे ईसाई, धन्यवाद। लेकिन कोई "getSession()" नहीं है - वर्तमान RequestAttributes पर उपलब्ध विधि। "सत्र में हेरफेर (सेटिंग/हो रहा है)" सीधे त्रुटि-प्रवण हो सकता है, मैं इसे एक सत्र में परिवर्तनीय नामकरण और हैंडलिंग से बचाना चाहता हूं ;-) – grailsInvas0r

+0

आपने यह कैसे देखा कि sessionSession() उपलब्ध नहीं है? मैंने एक grails कंसोल में कोड की कोशिश की और यह काम किया। – user852518

+1

ओह मुझे क्षमा मांगना है, यह काम करता है। लेकिन मेरे इंटेलिजे ने इसे रेखांकित किया है कि यह विधि मौजूद नहीं है: -ओ प्रत्येक दस्तावेज़ में यह उपलब्ध नहीं है। केवल पुराने Google परिणाम इस समाधान को दिखाते हैं। मुझे यकीन नहीं है कि यह भविष्य में काम करता है ?! मैं आश्चर्यचकित हूं: -O मेरा समाधान अब था: ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); वापसी servletRequestAttributes.getRequest()। GetSession (सत्य); – grailsInvas0r

17

यहां कुछ नमूना कोड जहां मैं अनुरोध या सत्र गुजर बिना एक सेवा से सत्र डेटा और अनुरोध डेटा खींच रहा हूँ है सेवा के लिए एक पैरामीटर के रूप में वस्तुओं।

package beecomplete 

import org.codehaus.groovy.grails.web.util.WebUtils 

class HelperService { 

    public User getCurrentUser() { 
     def webUtils = WebUtils.retrieveGrailsWebRequest() 
     return User.findById(webUtils.getSession().userid) 
    } 

    public Object getModelAttribute(String key) { 

     def webUtils = WebUtils.retrieveGrailsWebRequest() 
     return webUtils.getCurrentRequest().getAttribute(key) 
    } 
} 
+2

'WebUtils.retrieveGrailsWebRequest() सत्र' एक अद्भुत सुरुचिपूर्ण समाधान है। – tzrlk

+1

धन्यवाद, यह पूरी तरह से काम करता है। –

+0

बढ़िया! आप WebUtils क्लास कैसे खोजते हैं? – Mauro

9

नए संस्करणों के लिए (> 2.2) Grails की:

import org.codehaus.groovy.grails.web.util.WebUtils 

.... 
HttpServletRequest request = WebUtils.retrieveGrailsWebRequest().currentRequest 
HttpSession session = request.session 
0

बाद के संस्करणों में (Grails 2.5.0 में परीक्षण) तुम सिर्फ कर सकते हैं getSession (सही) एक सेवा से प्रत्यक्ष:

def myServiceMethod() { 
    def session = getSession(true) 
    ... 
}