Boa noite pessoal,
Estou aqui para contribuir/compatilhar com vocês uma solução que fiz para que se tenha o objeto no nosso menaged bean, sendo esse selecionado no SelectOneMenu, e isso sem a utilização de uma classe converter.
Eu procurei muito, revirei a internet e só encontrei problemas iguais ao meu. Encontrei “soluções” que acabavam por não resolver o problema, onde uma delas sugeria fazer a classe converter de um Managed Bean, onde não achei muito interessante, e que também não consegui fazer funcionar corretamente, dando muitos erros e me levando a loucura com tanto problema. No próprio fórum eu não consegui encontrar coisas claras e que realmente funcionassem.
Como sabemos, quando o SelectOneMenu carrega a lista de objetos, o que realmente está sendo mostrando não são eles, e sim strings, mais precisamente o caminho da classe e o id de cada objeto. Por consequência, quando selecionamos o valor que queremos, ao enviar para o servidor, claro, o que vai é a string, dai a necessidade de utilizar o converter, que pega o id do mesmo, converte para inteiro e faz a busca do objeto, com isso finalizando e retornando o mesmo.
O que acontece é que erros como: nullpointers com EJBs e outros objetos, são comuns. Tem a questão de utilizar lista de SelectItens ao invés das Classes que queremos, em fim, eu já estava ficando louco da cabeça de tentar resolver e não conseguir.
P.S: Estou utilizando JPA 2.1 e a injeção de EJBs nos converters creio eu que ainda não foi implementada nesse nova especificação, pois tentei de tudo e somente retorna nullpointers. Tentei lookup, de tudo, e simplesmente não funciona.
MInha solução:
Como eu disse, o que está sendo mostrado no SelectOneMenu são simplesmente strings que possuem o caminho da classe com os respectivos ids atrelados a cada string para representar cada objeto, tendo observado isso pensei: porque não setar a string no ManagedBean e tratar ela la ? … Achei bem mais simples !!!
Como ? … abaixo minha solução:
Aqui é o trecho da minha página xhtml contendo o SelectOneMenu:
<p:selectOneMenu id="pivo" value="#{cadastroResultadoMB.pivoSelecionado}">
<f:selectItem itemLabel="Selecione um pivo"/>
<f:selectItems var="pv" value="#{cadastroResultadoMB.pivo}"
itemValue="#{pv}"
itemLabel="#{pv.nome}"
/>
</p:selectOneMenu>
Minha Lista de Pivos
P.S: pivoDAO é um EJB Stateless
public List<Pivo> getPivo() {
this.listaPiv = pivoDAO.findAll();
return listaPiv;
}
Métodos Get e Set do tipo String, pois o valor será recebido como tal e não um objeto.
public String getPivoSelecionado() {
return pivoSelecionado;
}
public void setPivoSelecionado(String pivoSelecionado) {
this.pivoSelecionado = pivoSelecionado;
}
Quando a string é setada, ela vem da seguinte forma: br.com.embrapa.moscabranca.Pivo[ idPivo=1 ] (esse é o caminho da minha classe com o id do respectivo objeto representado pela string que selecionei no SelectOneMenu)
Vem exatamente assim !
O que devemos fazer é utilizar o método raplaceAll e retirar a parte da string que representa o id do objeto, converter ele pra inteiro e pronto, agora é só fazer a busca do mesmo.
public void objeto(){
String s = pivoSelecionado.replaceAll("[^0123456789]", "");
int id = Integer.parseInt(s);
Pivo pivo = pivoDAO.find(id);
}
Concordo que não seja a solução mais elegante, mas que é melhor do que tonar um converter um ManagedBean, isso é !!
Peço desculpas caso o que eu disse aqui já tenha sido proposto em algum outro tópico. Se isso já tiver ocorrido, desconsiderem, por favor.
Abraços a todos.