2015-11-19 3 views
0

J'ai besoin de construire des URLs jsf dans un @WebListener.FacesContext dans un @WebListener

Je pensais que je pouvais utiliser un extrait de code comme celui-ci

final FacesContext currentInstance = FacesContext.getCurrentInstance(); 
    final String actionURL = currentInstance.getApplication().getViewHandler() 
      .getActionURL(currentInstance, viewId); 

parce que la javadoc de l'.getCurrentInstance() affirme qu'il peut être « [...] appelé lors de l'initialisation de l'application ou l'arrêt », mais il n » t travail car il renvoie null.

Est-ce que je rate somenthing? Tout autre moyen de créer une URL étant donné le viewId?

Merci

+0

Quel est le véritable problème pour lequel vous pensez que cela pourrait être une solution? – Kukeltje

+0

C'est ce dont j'ai besoin. Au début du contexte, j'ai besoin de générer des urls pour une autre application web (complètement ignorante de jsf, mais cela ne devrait pas être relevenat) d'une manière agnostique de la configuration. Je sais que je pourrais faire quelque chose comme 'servletContext.getContextPath() +" /file.xthml "' mais je _hope_ il y a un meilleur moyen. –

+0

Pourquoi un «meilleur» moyen? Quel est le problème avec la façon dont vous le faites? Peut-être expliquer un peu plus – Kukeltje

Répondre

0

La méthode FacesContext.getCurrentInstance()ne retourne une facesContext instance valide entre le linstener (com.sun.faces.config.ConfigureListener dans mon cas) l'initialisation et la première manche du FacesServlet, dans lequel le facesContext mis en place par l'auditeur est libéré. Mon problème était que je laissais Wildfly ajouter l'écouteur et il a été ajouté juste après le mien. Forcing son chargement dans le web-fragment.xml/web.xml

<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 
<listener> 
    <listener-class>com.company.project.somepackages.Listener</listener-class> 
</listener> 

que mon auditeur a le contexte initialisé.

Ce code ci-dessus cependant ne fonctionne pas parce que le viewHandler quand essaie de résoudre le contextPath utilise la méthode externalContext.getRequestContextPath(), qui renvoie évidemment null, et non le externalContext.getApplicationContextPath() qui pourrait renvoyer la valeur correcte.