Cree y agregue mediante progtwigción un componente compuesto en el bean de respaldo

Estoy trabajando con un tablero dynamic donde los usuarios pueden fijar y eliminar elementos a su gusto. Ahora tengo un problema al querer agregar un componente compuesto existente a la vista desde el bean de respaldo. Intenté encontrar la forma correcta de hacerlo desde Internet pero hasta ahora no he tenido éxito. Aquí está el componente compuesto simple que quiero agregar:

           

Aquí está el código que debe devolver el componente compuesto:

 public static UIComponent getCompositeComponent(String xhtml, String namespace) { FacesContext fc = FacesContext.getCurrentInstance(); Application app = fc.getApplication(); Resource componentResource = app.getResourceHandler().createResource(xhtml, namespace); UIPanel facet = (UIPanel) app.createComponent(UIPanel.COMPONENT_TYPE); facet.setRendererType("javax.faces.Group"); UIComponent composite = app.createComponent(fc, componentResource); composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, facet); return composite; } 

Y así es como estoy usando la función:

 Column column = new Column(); UIComponent test = HtmlUtil.getCompositeComponent("test.xhtml", "comp"); column.getChildren().add(test); 

Pero nada se representa dentro de la columna. ¿Alguna idea de cómo se podría hacer esto? No quiero ir con la forma render = “# {bean.isThisRendered}” porque no encaja en mi caso de uso.

Este código está incompleto. Necesita usar FaceletContext#includeFacelet() para incluir el recurso componente compuesto en la implementación del componente compuesto. Aquí hay un método de utilidad que hace el trabajo. Es importante tener a los padres a mano, ya que es el contexto donde se debe crear el #{cc} en el scope de EL. Entonces, este método de utilidad también agrega inmediatamente el compuesto como hijo del padre dado. Además, es importante dar al componente compuesto una ID fija, de lo contrario JSF no podría procesar ningún componente de forma / entrada / comando dentro del compuesto.

 public static void includeCompositeComponent(UIComponent parent, String libraryName, String resourceName, String id) { // Prepare. FacesContext context = FacesContext.getCurrentInstance(); Application application = context.getApplication(); FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); // This basically creates  based on . Resource resource = application.getResourceHandler().createResource(resourceName, libraryName); UIComponent composite = application.createComponent(context, resource); composite.setId(id); // Mandatory for the case composite is part of UIForm! Otherwise JSF can't find inputs. // This basically creates . UIComponent implementation = application.createComponent(UIPanel.COMPONENT_TYPE); implementation.setRendererType("javax.faces.Group"); composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, implementation); // Now include the composite component file in the given parent. parent.getChildren().add(composite); parent.pushComponentToEL(context, composite); // This makes #{cc} available. try { faceletContext.includeFacelet(implementation, resource.getURL()); } catch (IOException e) { throw new FacesException(e); } finally { parent.popComponentFromEL(context); } } 

Entonces, en tu ejemplo particular, úsalo de la siguiente manera:

 includeCompositeComponent(column, "comp", "test.xhtml", "someUniqueId");