2010-10-17 22 views
2

J'ai le composant Seam session-scope, CustomIdentity qui remplace l'identité Seam standard (également session-portée). Le CustomIdentity étendu a une propriétéSeam Session tronqué composant disparaît dans la prochaine demande

@Out(required=false, scope=ScopeType.SESSION)private User user 

Dans la connexion surchargée() je définir un objet utilisateur, avec des renseignements du directeur de l'HttpServletRequest. Dans la première requête de l'application, l'objet Utilisateur est rejeté comme prévu dans la portée SESSION. Dans la deuxième requête, cependant, l'objet Utilisateur a disparu de la Session, et lorsque je visite une page qui l'injecte, j'obtiens une exception.

Ma question est quand exactement le composant est outjected:

  • Après chaque une méthode du composant CustomIdentity (même si elle ne contient pas de référence de user)?
  • Après chaque méthode contenant une référence du composant Utilisateur?

Et sur l'attribut required:

  • Si sur outjection l'objet utilisateur évalue à null, est déjà outjected utilisateur va être retiré du champ de session?

Cheers!

Répondre

3

À votre première question: le composant est oujeté après chaque méthode de CustomIdentity. Regardez le code source Seam correspondant org.jboss.seam.core.BijectionInterceptor (Seam 2.2.0). La bijection a lieu au niveau de la composante, c'est-à-dire, de la classe, du niveau.

À votre deuxième question: à chaque fois qu'une demande à CustomIdentity se termine, la valeur de votre champ est dépassée. Si vous utilisez la propriété de sortie require=false, le user qui est actuellement surpassé dans votre contexte de session peut être remplacé par null.

+0

Merci l'homme! Donc, si j'ai une méthode qui sera invoquée à un certain moment et qui mettra l'utilisateur dans la session * et la laissera là, quel que soit le nombre d'invocations de méthodes CustomIdentity, je devrais avoir @In (required = false) et @Out (requis = faux)? –

+0

Désolé, je voulais dire @Out (required = true). –

+1

Non cela ne fonctionnerait pas parce que l'injection a lieu si vous avez injecté ou non. Si vous avez exactement une méthode qui doit exclure l'utilisateur et que toute autre méthode ne doit pas * out * sortir l'utilisateur, vous avez deux possibilités: soit vous avez cette méthode particulière dans un composant séparé, soit vous l'exportez manuellement: 'Contexts.getSessionContext() .set ("user", user); ' – kraftan