JSF2: "<h:selectOneMenu" aninhado em uma "<h:dataTable"

Olá amigos,

Como faço para recuperar os valores selecionados de um selectOneMenu aninhado em uma dataTable?

 <h:dataTable var="c" value="#{produtoController.listaCaracteristica}" >
...

 <h:column>
        ...
	<h:selectOneMenu value="#{produtoController.caracteristicasSelecionadas[c.id]}">  
		<f:converter converterId="CaracteristicaDeProdutoConverter" /> 
		<f:selectItem itemValue="-1" itemLabel="Selecionar um valor"/> 
		<f:selectItems  value="#{c.valores}"  />  
	</h:selectOneMenu>                                 
</h:column>

O meu Controller:

@ManagedBean
@SessionScoped
public class ProdutoController {

    private Produto bean;
    private DataModel<Produto> listagem;
    private Map<Long, Boolean> selecionados = new HashMap<Long, Boolean>();
    private List<Caracteristica> listaCaracteristica = new ArrayList<Caracteristica>();
    private List<CaracteristicaDeProduto> caracteristicasSelecionadas = new ArrayList<CaracteristicaDeProduto>();
...

Converter:

@FacesConverter("CaracteristicaDeProdutoConverter")
public class CaracteristicaDeProdutoConverter implements Converter {

    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        return "";
    }
}
...

Pra começar o getAsObject desse converter não é chamado nunca.
O outro problema é que não encontrei uma forma de recuperar todas as seleções que o usuário fez nas múltiplas ComboBox exibidas.

Alguém já implementou algo parecido?

acho que você tem que associar seu <h:selectOneMenu> a um value primeiro.

Pronto, alterei, já estava assim, mas tirei porque estava fazendo uns testes aqui. Mas o problema não era esse não.

poste seu converter aí por favor.

só pra constar, eu normalmente faço assim: <h:selectOneMenu value="#{meuMB.valorQueEuQuero}" converter="converters.meuConverter"> <f:selectItem itemValue="#{null}" itemLabel="Selecione..."/> <f:selectItems value="#{meuMB.listDeValores}" var="item" itemLabel="#{item.descricao}" itemValue="#{item.codigo}" /> <f:ajax event="change" execute="@this" render="@this" /> </h:selectOneMenu>

Coloquei o meu Controller, e o meu converter, atualmente não faz nada ^^, só retorna strings porque estou testando, o problema é que o método nunca é chamado.

Sim, mas se a gente puder ver o Converter, talvez haja algo nele que explica o por que ele nunca é chamado.

com Multiple não… o getAsString é invocado?

Sim, esse é chamado, mas o getAsObject não.

Experimente adicionar a tag <f:ajax> do meu exemplo acima. O getAsObject deverá ser invocado sempre que você alterar o combo.

Coloquei a tag de AJAX aqui, mas o que acontece agora é que quando eu mudo a seleção, ele retorna ao estado anterior (“Selecione um item…”) como se tivesse postando, e restaurando o estado da view, só que com estado default.

Quando eu mudasse a seleção, o getAsObject era para ser chamado?

[quote=xdraculax]Coloquei a tag de AJAX aqui, mas o que acontece agora é que quando eu mudo a seleção, ele retorna ao estado anterior (“Selecione um item…”) como se tivesse postando, e restaurando o estado da view, só que com estado default.

Quando eu mudasse a seleção, o getAsObject era para ser chamado?[/quote]

Sim. O que está acontecendo é que seu getAsObject não retorna um objeto que existe na sua lista, então ele seta o primeiro cara da lista na sua view.