JSF - Passar valores para componente reutilizável

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;
  }
}


O teu MBean está configurado !!! Olha a mensagem de erro

[color=red]arget Unreachable, identifier ‘controladorArvore’ resolved to null[/color]

Não sei se a tua
propriedade hiddenId tem que estar instanciada!!!

Olá Thiago, obrigado pela resposta. A propriedade idHidden está sim instanciada. Logo que eu carrego a árvore, tudo funciona normal. O problema ocorre quando eu seleciono um item da árvore, neste momento uma chamada ajax pra um método no bean é gerada. Na hora de renderizar novamente, eu recebo essa mensagem de erro. Porém, se eu alterar o escopo do ControladorArvore de PAGE pra SESSION, ele funciona. Apenas com o PAGE dá o erro.

Então coloque-o para request

Infelizmente a aplicação exige que seja PAGE, e ainda por cima com REQUEST dá o mesmo erro.

Mas tipo, às vezes a melhor solução é nem usar o binding. A grande questão pra mim é, como passar um parâmetro recebido por um xhtml para o seu bean correspondente?

Como, ao incluir o parâmetro desta forma:

    <h:form id="formPesquisa">  
         <ui:include src="componenteArvore.xhtml">  
             <ui:param name="id" value="460" />  
     </ui:include>  
   </h:form> 

eu consigo preencher um campo (por exemplo, Integer) no bean ControladorArvore.java sem que haja um submit da página? Se houver um submit, eu posso passar como @RequestParameter usando <f:param>, porém no meu caso não há submit, um componente está embutido no outro.

Acho que o seu caso se resolve com a tag <f:setPropertyActionListener>

Olá, obrigado pela resposta, mas aparentemente a tag <f:setPropertyActionListener> tem que ser utilizada dentro de um action source (tipo um <a4j:commandLink, etc.). No meu caso, eu não tenho este action source, o componente reutilizável é incluido com a tag <u:include> dentro do componente pai, e o pai precisa passar para o bean do componente reutilizável um valor.