2010-11-29 29 views
2
@ResourceDependency(library = "component/myComponent", name = "myComponent1.css") 
public class MyComponent1 extends UIComponentBase { 

    public void encodeBegin(FacesContext context) throws IOException { 
     MyComponent2 comp2 = new MyComponent2(); 
     getChildren().add(comp2); 
    } 

} 

@ResourceDependency(library = "component/myComponent", name = "myComponent2.css") 
public class MyComponent2 extends UIComponentBase { 

    // ... 

} 

myComponent1.css inclus dans la page obtient, myComponent2.css ne fonctionne pas.JSF 2.0: @ResourceDependency ne fonctionne pas lors de l'ajout UIComponent programme

Caractéristique? Punaise? Problème de configuration?

Est-ce qu'il y a un moyen programmatique d'ajouter des ressources pour peut-être contourner ce problème?

Courir Mojarra 2.0.2

+0

J'ai tracé cela un peu plus loin. Il semble que JSF ne trouve pas (= recherche) les annotations du composant ajouté par programmation, elles n'ont donc aucun effet. En regardant le code JSF/Mojarra, il semble y avoir plusieurs chemins pour créer un composant. Je suppose que la création d'un composant via un gestionnaire de balises effectue une recherche d'annotation d'une manière différente de l'approche par programmation. Je vais signaler cela comme un problème à Mojarra tracker pour leur inspection plus minutieuse si personne ne se distingue pour me corriger :) –

Répondre

5

Je sais que cela a été demandé il y a 10 mois, mais je l'ai fait face à ce même problème. Votre problème de ressources est dû au fait que vous utilisez "new" pour instancier votre composant enfant. Au lieu de cela, vous devez utiliser context.getApplication().createComponent("MyComponentType"), "MyComponentType" étant ce que vous avez spécifié comme valeur dans l'annotation @FacesComponent. L'application analyse les annotations pendant la création du composant et non lors de son rendu. L'utilisation de new prive l'application de l'opportunité de gérer les annotations. Malheureusement, cela ne résout pas vraiment le problème, il devrait le faire, mais ce n'est pas le cas.

Si vous ajoutez:

UIComponent headFacet = context.getViewRoot().getFacet("javax_faces_location_HEAD"); 
if (headFacet == null) { 
    System.out.println("No Head Facet"); 
} else { 
    System.out.println("Head Children: " + headFacet.getChildCount()); 
    for (UIComponent c : headFacet.getChildren()) { 
     System.out.println(c.getRendererType()); 
     System.out.println(c.getAttributes().get("name")); 
    } 
} 

à votre méthode de encodeBegin vous serez en mesure de voir que les ressources ont effectivement été ajoutés (par exemple en ajoutant la PrimeFaces FileUpload comme un enfant):

INFO: Head Children: 4 
INFO: javax.faces.resource.Stylesheet 
INFO: fileupload/fileupload.css 
INFO: javax.faces.resource.Script 
INFO: jquery/jquery.js 
INFO: javax.faces.resource.Script 
INFO: core/core.js 
INFO: javax.faces.resource.Script 
INFO: fileupload/fileupload.js 

malheureusement, ils ne sont jamais restitués, c'est comme si le composant avait une vue différente de la page sur laquelle il est finalement rendu. Je suis toujours à la recherche de cela avant de rapporter des bugs. Je cours actuellement mojarra 2.0.6, je peux l'essayer sur 2.2 pour voir si le problème est résolu.

Mise à jour: Testé sur Mojarra 2.1.3 et 2.2-SNAPSHOT. Cela ne marche pas non plus. J'ai ajouté un issue à la mise à jour d'émission Mojarra Tracker

Encore une fois: Les personnes de plus de Mojarra me ont informé que le encodeBegin n'est pas l'endroit idéal pour essayer d'ajouter des composants. Ils m'ont pointé à cette annonce blog, qui décrit comment "en toute sécurité" le faire.

+0

Vous avez clairement fait une meilleure recherche ici. J'ai vérifié le billet (je ne me souviens pas si j'en ai créé un moi-même) et le blog bost. Je suis d'accord avec vous, l'approche requise est très peu intuitive, ou, bien, peut-être même intuitive * si * vous connaissiez toute la spécification JSF. Mais alors, de nombreuses questions dans JSF ne sont pas intuitives, alors devinez que j'aurais dû m'y attendre. Choisir comme réponse acceptée, merci de partager même après 10 mois :) –