Aleluia consegui fazer o que queria. Segue uma breve explicação de como fiz para ter meus SelectOneMenu dependetes.
Eu tenho a página JSP com o seguinte código.
<h:selectOneMenu id="regional" valueChangeListener="#{ConsumidorBean.regionalChanged}" onchange="submit()">
<f:selectItems value="#{RegionalBean.todosParaComboBox}" />
</h:selectOneMenu>
<h:selectOneMenu id="sistema" value="#{ConsumidorBean.consumidor.sistema.id}">
<f:selectItems value="#{ConsumidorBean.todosSistemas}" />
</h:selectOneMenu>
No atributo valueChangeListener da Tag SelectOneMenu eu vinculei o método regionalChanged do meu Bean Consumidor. Isso quer dizer que este método vai ser chamado sempre que o SelectOneMenu tiver o seu valor modificado.
No atributo onchange eu coloquei a instrução submit() para que o formulário seja enviado e ele seja reprocessado. Acho que esta parte é bem clara para todos.
Agora vamos para o Bean
public void regionalChanged(ValueChangeEvent event){
idRegional = Integer.parseInt((String) event.getNewValue());
}
A assinatura deste método deve ser como está acima: do tipo void e com um parâmetro do tipo ValueChangeEvent. O método getNewValue() retorna um Object ai você tem que fazer os casts como precisar. No meu caso eu preciso de um Inteiro.
:?: Mas porque você não colocou diretamente o cast para Inteiro: idRegional = (Integer) event.getNewValue() :?:
Pelos meus testes eu entendi que mesmo o retorno do método getNewValue() sendo um Object, verdadeiramente o valor é do tipo String. Então eu precisei fazer como fiz. Na verdade eu percebi isso com a mensagem de erro quando tentei usar apenas o cast pra Integer, não sei explicar perfeitamente este detalhe. Se alguém que tenha conhecimento puder contribuir, será de grande valia para todos.
Bem, está ai o mínimo que se precisa para capturar o valor de um SelectOneMenu para popular outro dependente deste.
Para deixar mais claro o funcionamento vou postar o código do método que popula o SelectOneMenu de id sistema.
public List getTodosSistemas() throws Exception{
List sistemasJsf = new ArrayList();
List<Sistema> sistemas = new GerenciadorSistema().retornarSistema(idRegional);
for (Sistema elem : sistemas) {
String id = Integer.toString(elem.getId());
sistemasJsf.add(new SelectItem(id, elem.getDescricao()));
}
return sistemasJsf;
}
Neste método getTodosSistemas faço uso da propriedade idRegional na terceira linha, cuja recebeu o valor do SelectOneMenu que disparou o método regionalChanged.
Acho que é isso. Nada de avançado demais, mas funcional e tudo isso foi dito, não de forma detalhada, na primeira página deste tópico pelo schmidt.
Comentários são bem vindos, principalmente aqueles que mencionarem cuidados, alertas e possíveis problemas com essa implementação.
Obrigado!