2011-02-23 5 views
3

J'ai un état de portée de session. La première idée à retenir était les servlets de portée de session. Alors je lie mon servlet comme celui-ciEtat de session utilisant guice

bind(Foo.class).in(ServletScopes.SESSION); 

Mais je reçois une exception

javax.servlet.ServletException: servlets doivent être liés comme singletons. Key [type = Foo, annotation = [none]] n'était pas lié dans la portée singleton.

Ainsi servlets ne peuvent pas avoir la portée de ServletScopes? Quelle est la bonne façon de traiter l'état de la session (oui, bien sûr, il est préférable d'écrire l'état moins de servlets/classes/applications)?

Répondre

3

De ma compréhension vous pouvez lier tout ce que vous voulez à la session portée, le problème est que dans votre exemple Foo semble être une sous-classe de Servlet, et servlets doivent être liés dans Singleton portée.

Pour résoudre ce problème, bind votre état (appelé Bar) portée session et donner à votre constructeur Foo un argument Provider<Bar> (qui sera rempli par Guice) afin que vous puissiez accéder à l'état scope session du singleton Foo Servlet.

+0

Merci beaucoup. C'est ce dont j'ai besoin. –

2

Les servlets ne sont pas créés par Guice, mais par le conteneur de servlets. Et ce sont des singletons: une seule instance est créée par le conteneur de servlet pour servir toutes les requêtes de tous les clients. Donc, les lier à la portée de la session n'a aucun sens: Guice ne peut pas créer une instance de servlet différente par session.

Une servlet doit toujours être apatride (à savoir son état devrait être globale à tous les clients, et accessibles dans un thread-safe mode)

+0

Ok. Merci. Mais dans quel but ServletScopes a été créé? Et où dois-je mettre mes variables de portée de session? –

+1

Guice crée réellement des servlets lorsque vous utilisez l'extension guice-servlet. Il faut que les servlets soient des singletons car ils sont compatibles avec les spécifications de servlet. – ColinD