2009-09-29 8 views
1

Suis-je raison de penser que ce ne peut pas être la meilleure idée:JSF - appeler FacesContext.getCurrentInstance() dans un contexte statique

private static Application app = FacesContext.getCurrentInstance() 
     .getApplication(); 

... ou tout autre appel à FacesContext.getCurrentInstance() lorsque vous ne pouvez pas être sûr que le thread d'exécution actuel est dû à une requête de servlet? La façon dont je le comprends, FacesContext.getCurrentInstance() fonctionne en affectant le contexte des faces courantes au thread (par exemple la variable ThreadLocal). Le fonctionnera probablement dans une classe comme un bean backing JSF ou une classe de composants JSF, car le thread d'exécution qui charge la classe et instancie les membres de la classe (variables statiques) sera généralement une requête FacesServlet. Mais je ne pense toujours pas que ce soit une bonne idée d'y compter.

D'accord ou en désaccord? Des idées? Merci.

+0

Certainement pas une bonne idée. Quel est le problème racine ici? Peut-être que nous pouvons fournir une meilleure solution. – Drew

+0

Je ne suis pas vraiment sûr - ce n'est pas mon code! J'ai été assigné au projet après que beaucoup de choses aient été construites et maintenant je corrige des défauts etc. Si j'obtiens le temps j'examinerai et me rappellerai à toi. À votre santé. –

Répondre

1

L'utilisation de FacesContext.getCurrentInstance() lors de l'initialisation peut être une bonne idée selon le contexte.

Je ne peux pas imaginer un scénario où l'assigner à un var statique serait une bonne idée, cependant.

2

Cela ne ressemble pas à quelque chose que vous voulez vraiment faire.

Si vous devez obtenir une référence statique à l'application, initialisant par un ApplicationFactory serait probablement une meilleure approche:

public final class CustomApplicationFactory extends ApplicationFactory { 
    private static volatile Application APPLICATION; 
    private final ApplicationFactory decorated; 

    public CustomApplicationFactory(ApplicationFactory decorated) { 
    this.decorated = decorated; 
    } 

    @Override public Application getApplication() { 
    APPLICATION = decorated.getApplication(); 
    return APPLICATION; 
    } 

    @Override public void setApplication(Application application) { 
    APPLICATION = application; 
    decorated.setApplication(application); 
    } 

    public static Application getApp() { 
    return APPLICATION; 
    } 
} 

Ce serait enregistré dans votre faces-config.xml. Cette classe de démonstration est vulnérable aux bogues liés ClassLoader si vous ne la gardez pas isolée à une seule application.

Il y a probablement une meilleure façon de faire ce que vous essayez de faire.

Questions connexes