2011-08-15 2 views
15

J'ai un problème avec Grails Session. Je pensais avoir une classe de service pour la gestion de ma session. J'ai donc créé une classe appelée "SessionService" (sous grails-app/services/grails /).Les grils obtiennent la session et la gestion dans la classe de service

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

Le problème est maintenant, que je reçois un Nullpointer-Exception:. "méthode a jeté exception 'java.lang.NullPointerException' Impossible d'évaluer org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession .ToString() ".

Utilisation de ma classe de service, par ex. dans un contrôleur:

class SampleController { 

    SessionService sessionService 

    def selectAnything = { 

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

Qu'est-ce que je fais mal ici? Est-ce la bonne façon? Ou dois-je définir "session = request.session" dans chaque méthode?

Nous espérons obtenir de l'aide de votre part.

Merci beaucoup d'avance.

Cheers,

Marco

Répondre

31

Vous devez faire quelque chose comme

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

dans toutes les méthodes de votre service. Mais ce n'est pas clair pour moi, pourquoi vous avez besoin d'un tel service. Vous pouvez AllWays accéder à la session de votre contrôleur comme ça ...

session.someAttribute = "someValue" 

Christian

+1

Salut Christian, merci. Mais il n'y a pas de méthode "getSession()" disponible sur currentRequestAttributes. Faire "La manipulation de session (paramétrer/obtenir)" peut directement être sujet aux erreurs, je veux éviter qu'il garde une variable de session nommant et manipulant en un seul endroit ;-) – grailsInvas0r

+0

Comment avez-vous vérifié que getSession() n'est pas disponible? J'ai essayé le code dans une console de grails et cela a fonctionné. – user852518

+1

Oh, je dois m'excuser, ça marche. MAIS mon IntelliJ souligne que cette méthode n'existe pas: -O Aussi dans chaque documentation ce n'est pas disponible. Seuls les anciens résultats google montrent cette solution. Je ne suis pas sûr que cela fonctionne à l'avenir ?! Je suis surpris: -O Ma solution était maintenant: ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); return servletRequestAttributes.getRequest(). GetSession (true); – grailsInvas0r

17

Voici quelques exemples de code où je tire les données de session et les données de demande d'un service sans passer la demande ou de la session objets en tant que paramètre du service.

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' est une solution merveilleusement élégante. – tzrlk

+1

Merci, cela fonctionne parfaitement. –

+0

Super! Comment découvrez-vous la classe WebUtils? – Mauro

9

Pour les nouvelles versions (> 2.2) de Grails:

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

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

Dans les versions ultérieures (testé dans Grails 2.5.0) vous pouvez juste faire getSession (vrai) directe d'un service:

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