2011-08-15 8 views
15

Mam problem z sesją Grails. Myślałem o posiadaniu klasy usług dla mojej obsługi sesji. Stworzyłem więc klasę o nazwie "SessionService" (pod grails-app/services/grails /).Grails pobierają sesję i zarządzanie w klasie usług

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") 
    } 
} 

Problem jest teraz, że mogę dostać NullPointer wyjątku. "Metoda wyrzucił wyjątek«java.lang.NullPointerException»nie może oceniać org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession .ToString() ".

Korzystanie z mojej klasy usług, np. w kontrolerze:

class SampleController { 

    SessionService sessionService 

    def selectAnything = { 

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

Co ja tu robię źle? Czy to właściwa droga? Czy muszę ustawić "session = request.session" w każdej metodzie?

Mam nadzieję, że otrzymam pomoc od Ciebie.

Dziękuję bardzo z góry.

Cheers,

Marco

Odpowiedz

31

Trzeba coś zrobić jak

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

w każdej metodzie usługi. Ale nie jest dla mnie jasne, dlaczego potrzebujesz takiej usługi. Można zawsze dobrze otworzyć sesję w kontrolerze jak to ...

session.someAttribute = "someValue" 

Christian

+1

Hej, Christian, dzięki. Ale nie ma metody "getSession()" - dostępnej w currentRequestAttributes. Wykonanie "manipulacji sesyjnej (ustawianie/otrzymywanie)" może być podatne na błędy, chcę tego uniknąć, utrzymując nazwę i obsługę zmiennej sesji w jednym miejscu ;-) – grailsInvas0r

+0

W jaki sposób sprawdziłeś, czy getSession() nie jest dostępny? Wypróbowałem kod w konsoli Grails i zadziałało. – user852518

+1

Och, przepraszam, działa. ALE mój IntelliJ podkreśla, że ​​ta metoda nie istnieje: -O Również w każdej dokumentacji nie jest dostępna. Tylko stare wyniki google pokazują to rozwiązanie. Nie jestem pewien, czy to zadziała w przyszłości ?! Jestem zaskoczony: -O Moje rozwiązanie było teraz: ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); return servletRequestAttributes.getRequest(). GetSession (true); – grailsInvas0r

17

Oto przykładowy kod gdzie jestem ciągnięcie dane sesji i danych żądania z usługi bez przechodzenia żądanie lub sesję obiekty jako parametr usługi.

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(). session' to cudownie eleganckie rozwiązanie. – tzrlk

+1

Dzięki, że działa idealnie. –

+0

Świetnie! Jak odkryć klasę WebUtils? – Mauro

9

Dla nowych wersjach (> 2,2) z Grails:

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

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

W późniejszych wersjach (testowane w Grails 2.5.0) można po prostu zrobić getSession (true) bezpośrednio z usługi:

def myServiceMethod() { 
    def session = getSession(true) 
    ... 
} 
Powiązane problemy