Olá pessoal, estou utilizando o componente árvore do rich:faces -> rich:tree. Este componente estará dentro de um arquivo xhtml, e este será vinculado a um bean, e deverá ser incluído em várias telas. Ao final segue o código resumido do componente. Observem que estou tentando passar um parâmetro (id = 460, no caso) para que o componente possa fazer uma pesquisa no banco de dados.
A grande dificuldade é em como vincular este id a uma propriedade do bean reutilizável (ComponenteArvore.java). Uma forma que tentamos, que está no código abaixo, é utilizar um campo hdden e vincula-lo, atraves do “binding”, a um HtmlInPutHidden (objeto do jsf) no java. Desta forma, conseguimos passar o valor para o java. Porém, quando selecionamos um item na árvore, o método guardarItemSelecionado é acionado. Neste momento, ocorre um erro:
Caused by:
javax.el.PropertyNotFoundException: /painelArvore.xhtml @15,97 binding="#{controladorArvore.hiddenId}": Target Unreachable, identifier 'controladorArvore' resolved to null
O escopo do bean ControladorArvore.java é PAGE, e a URL não é alterada quando o ajax da seleção é chamado. Foi necessário, no java, declarar o HtmlInputHidden como transient pois os objetos do JSF (que extendem UIComponent) não são serializáveis.
Alguém saberia dizer como corrigir este erro ou então uma outra forma de passar um parâmetro para o bean ControladorArvore.java? É possível passar como um @RequestParameter quando há carregamento da tela, mas nesse caso isto não ocorre, pois o componente reutilizável está embutido na telaPrincipal.
Agradeço qualquer ajuda,
Chicoscience
Códigos:
telaPrincipal:
...
<h:form id="formPesquisa">
<ui:include src="componenteArvore.xhtml">
<ui:param name="id" value="460" />
</ui:include>
</h:form>
...
componenteArvore.xhtml:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:syn="http://www.synergia.dcc.ufmg.br/jsf/facelets-tags">
<h:panelGrid columns="1" border="0">
<h:inputHidden value="#{id}" binding="#{controladorArvore.hiddenId}" />
<rich:tree switchType="client" ajaxSubmitSelection="true"
id="idArvore"
nodeSelectListener="#{controladorArvore.guardarItemSelecionado}"
reRender="painelBotoesArvorePercurso">
<rich:recursiveTreeNodesAdaptor
roots="#{controladorArvore.montarArvore()}"
var="item" nodes="#{item.getGruposOuPercursos()}">
<rich:treeNode>
<h:outputText value="#{item.nomeSimples}" />
</rich:treeNode>
</rich:recursiveTreeNodesAdaptor>
</rich:tree>
</rich:panel>
<rich:panel style="border:0" id="painelBotoes">
...
</rich:panel>
</h:panelGrid>
</ui:composition>
bean ControladorArvore.java
@Name("controladorArvore")
@Scope(ScopeType.PAGE)
public class ControladorArvore implements Serializable
{
private static final long serialVersionUID = 1L;
... //(propriedades)
private transient HtmlInputHidden idVersao;
public ControladorArvore() {
}
public void guardarItemSelecionado(NodeSelectedEvent event)
{
...
}
public List<...> montarArvore()
{
...
}
public HtmlInputHidden getHiddenId()
{
return hiddenId;
}
public void setHiddenId(HtmlInputHidden hiddenId)
{
this.hiddenId = hiddenId;
}
}