2010-10-26 17 views
2

Considérons cet exempleQuel est le point de la portée sur Déballer composants (Manager)

@Scope(ScopeType.SESSION) 
@Name("test") 
@BypassInterceptors 
public Class Test { 

    @Unwrap 
    public List<String> test() { 
     //do a long and major calculation and return the List 
    } 
} 

Ensuite, vous avez une vue et que vous obtenez votre liste

<h:selectOneMenu value="#{someBean.text}"> 
    <s:selectItems value="#{test}"/> 
</h:selectOneMenu> 

Maintenant, à mon avis, parce que je Scope session, la liste doit être mise en cache, ou le Seam Manager composant au moins, de sorte qu'il s'exécutera une fois, mais lorsque vous revisitez la page dans la même session, il ne devrait pas fonctionner à nouveau, mais quand je ré-entrer la page la méthode Unwrap est encore exécutée. Donc, ma question est, quelle est la différence entre la portée de la session et dire la portée de l'événement ici?

Pour contourner ce que je l'ai mis en cache manuellement la liste dans le contexte de la session et le récupérer à partir du contexte si elle est présente dans la méthode @Unwrap

Répondre

2

On dirait que j'ai mal compris le composant Gestionnaire.

Le @Unwrap est utile si vous souhaitez effectuer une action avant d'accéder à l'objet. par exemple. le SMPC utilise @Unwrap pour s'assurer qu'il a joint la transaction à chaque fois.

Il s'agit en fait de l'annotation @Factory qui correspond à mes besoins, ce qui annulera la valeur de retour.

Ainsi, la portée du composant est toujours valide en tant qu'oscopes de composants Seam normaux. Bien sûr, dans cet exemple précis, ce n'est pas très utile car il n'y a pas de champs.

2

@Unwrap diffère de @Factory car il est évalué chaque fois qu'il est demandé. Si vous avez une page qui a besoin de temps en cours et cette demande de page la date actuelle trois fois comme suit

#{currentDate} 

#{currentDate} 

#{currentDate} 

Parce que le composant qui encapsule currentDate définit une méthode de @Unwrap, il est évalué trois fois

Si vous ont @Factory à la place, il est juste évalué une fois

#{compon.someFactory} 

#{compon.someFactory} 

#{compon.someFactory} 
+0

Oui, j'ai enfin compris cela. C'est étrange, j'utilise Seam maintenant quotidiennement depuis deux ans et demi, et j'apprends encore des choses. Cadre majeur! –