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.
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 :) –