2009-12-12 2 views
1

Disons que je l'intercepteur suivante dans une application SEAM:SEAM: Composant "désinjecté" "trop ​​tôt" dans l'intercepteur?

public class MyInterceptor { 
    @In 
    private Monitor myMonitor; 

    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ctx) throws Exception { 
    try { 
     myMonitor.a(); 
     return ctx.proceed(); 
    } 
    finally { 
     myMonitor.b(); 
    } 
    } 
} 

myMonitor.a() fonctionne, myMonitor.b() (si correctement moniteur est injecté) échoue parce que Monitor est déjà nulle. Seam Doc indique: "Les valeurs injectées sont désinjectées (c'est-à-dire, mises à zéro) immédiatement après l'achèvement et l'élimination de la méthode."

Est-ce que c'est ce qui se passe? Puis-je faire quelque chose pour dire à SEAM de ne pas "désinjecter" le composant? Je peux bien sûr aussi faire quelque chose comme XContext.get (..), mais je me demande s'il s'agit d'un bug ou d'une erreur de mon côté. Merci!

Répondre

1

Essayez plutôt celui

Object response = null; 

try { 
    myMonitor.a(); 

    response = ctx.proceed(); 
} finally { 
    myMonitor.b(); 
} 

return response; 

salutations

1

Évitez d'utiliser l'injection.

Essayez de contourner ce problème. Je vois que vous avez une sorte de surveillance en cours. Regardez cet intercepteur qui capture la durée d'exécution d'une méthode dans les composants Seam. Essayez de modifier votre code pour qu'il corresponde à cela.

Cela fonctionne très bien! Voici la link

+0

@Shervin Bon à savoir (+1), Shervin. Seam Framework: Découvrez l'évolution de Java EE dit que vous pouvez éviter @ In-jection en utilisant une seule méthode setter sans aucune annotation @In. –

0

Seam fonctionne comme annoncé.

Vous pouvez simplement ignorer la disinjection:

public class MyInterceptor { 

    private Monitor myMonitor; 

    @In 
    private void setMonitor(Monitor aMonitor) { 
    if (aMonitor != null) { 
     myMonitor = aMonitor; 
    } 
    } 


    @AroundInvoke 
    public Object aroundInvoke(InvocationContext ctx) throws Exception { 
    try { 
     myMonitor.a(); 
     return ctx.proceed(); 
    } 
    finally { 
     myMonitor.b(); 
     myMonitor = null; //perform disinjection yourself 
    } 
    } 
} 

La mise en garde est ici que Seam est disinjecting la référence pour une raison. Seam veut contrôler le cycle de vie et l'identité de "myMonitor" et en gardant une référence, vous ne respectez pas votre contrat avec Seam. Cela pourrait conduire à un comportement inattendu. Par exemple, si myMonitor était pour une raison quelconque dans la portée Stateless, Seam pourrait le détruire avant le retour de ctx.proceed(), vous laissant une référence à un proxy brisé. Le meilleur conseil est de connaître la portée et le cycle de vie de ce que vous retenez puisque vous «vivez sur le bord».

+0

Hmm, désolé mais je ne comprends pas vraiment comment votre code m'aiderait. Mon problème est que dans la ligne "myMonitor.b()", myMonitor est null. (Ce que vous décrivez dans votre deuxième paragraphe est ce qui se passe). Je ne vois pas comment cela fonctionne "Seam fonctionne comme annoncé", puisque je suppose que "l'achèvement de la méthode" inclut l'exécution de tous les blocs finally {} - ou ai-je tort? – wilth

Questions connexes