Para você: EntityConverter para qualquer entidade e tipo de Id

[quote=Flavio Almeida]Hoje eu estou bem atarefado, mas responderei com mais calma à noite.

Faça assim:

itens.add(new SelectItem(null, “”)); // string em branco no lugar de “Selecione”

Perfil tem a anotação @Id ou @EmbeddableId?

Estamos usando este converter em produção sem problemas, mas estou interessado em ajudar você a resolver seu problema.[/quote]

O Perfil tem a anotação @Id.

Colocar uma string em branco só vai remover o “Selecione” do combo, mas o erro vai continuar.
Vou continuar debugando aqui, acho que deixei escapar algo rs.

Valeu!

cara, esse erro acontece quando você seleciona qualquer item da combo?
A combo renderiza direitinho, com todos os itens?

[quote=Lucas Sorrentino]cara, esse erro acontece quando você seleciona qualquer item da combo?
A combo renderiza direitinho, com todos os itens?[/quote]

Então Lucas, ele renderiza normal, com todos os itens e o erro acontece com qualquer item selecionado.
Vou fazer um teste aqui, acho que o problema é no meu combo, to fazendo algo errado… assim que testar ja posto algo.

Valeu!

Harry,
essa lista que você ta passando pra sua página é uma lista de select item? Esse seu usuarioBean.perfis?

É sim Lucas, é uma lista de select item, gero ela assim:

List<SelectItem> itens = new ArrayList<SelectItem>();
   itens.add(new SelectItem(null, "Selecione"));
		
   for (Perfil perfil : perfis)
   {
       itens.add(new SelectItem(perfil, perfil.getDescricao()));
   }
   return itens;

Esse combo não é required, mas resolvi deixa-lo para ver o que acontece. Mesmo que você selecione um item ele não entende que foi selecionado, exibe uma mensagem que o campo perfil é obrigatório, como se o meu equals não tivesse sido implementado, mas foi.
Enfim, já achei o erro mas não sei como solucionar, pois aparentemente está correto.

Tenho uma outra aplicação com um combo, mas que possui um converter especifico que funciona perfeitamente.
Refiz o combo baseado neste que funciona, exceto o converter pois quero utilizar o generico e mesmo assim é como se não tivesse selecionado nada no combo.

Fui claro?

Só percebi isso pois tentei utilizar o combo como required.

Esquece o que falei no ultimo post, to viajando aqui…rs
Ele não reconhece que o combo foi preenchido pq o converter só retorna null no método getAsObject() rs.

A ideia do converter é colocar o objeto num map e depois recuperar pela chave que é o id, certo ?
Quando vou recupar o map está vazio:

  // só retorna null  
  component.getAttributes().get(value);

Sei lá, vou recomeçar esse combo do zero, refazer tudo pra ver se não to fazendo besteira rs.

Valeu pela ajuda!

Lucas e Flavio, fiz um projetinho do zero aqui e o converter funcionou perfeitamente.
Como suspeitava o problema é no meu código, vou ver o que consigo e posto aqui.

Muito obrigado pela ajuda!

Que bom que funcionou, já estava achando que era algum problema não identificado antes no código.
Abraço

Só uma dúvida, vcs usam jsf com o que? richfaces, facelets?

Ah, descobri o motivo de não funcionar rs.

Achei isso no web.xml

<context-param>
   <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
   <param-value>true</param-value>
</context-param>

Estava como ‘true’ então passei pra ‘false’:

<context-param>
  <param-name>facelets.BUILD_BEFORE_RESTORE</param-name>
  <param-value>false</param-value>
</context-param>

Como meu acesso a internet é limitado não pude procurar pra que realmente serve essa configuração.

Agora ta funcionando legal.

Valeu pela ajuda!

HarryPodre, muito bem apontado. Realmente, usamos essa opção com o valor “false” em nossas aplicações.

http://www.jsfcentral.com/listings/A23139;jsessionid=B10FB0FDD00C333B6F6D884FD05D25D5.tomcat28?link

:smiley: Flavio Almeida !!!

Meus Parabéns pela solução, pelo visto tivemos pesquisando nos mesmos lugares. rsrs (http://www.rponte.com.br)
Eu estava muito desapontado em ter que fazer um converter para cada entidade do meu modelo.

A priori, está funcionando bem. vou continuar os testes, porém não estou usando a versão com reflex, para evitar o uso de mais uma biblioteca.
O que acha ?
No que for possível te darei feedback.

Forte abraço. Continue assim, a nosso comunidade é forte por isso. :wink:

Não vejo problema algum. Eu prefiro a versão da biblioteca, porque deixa o código mais claro. Se não estou enganado, há um sistema nosso rodando a versão sem a biblioteca de reflexão há um bom tempo sem ter problema.

O feedback é muito importante, acredite, ainda mais que utilizamos essa classe em ambiente de produção.

Qualquer dúvida é só postar aqui.

Abraço

[quote=Flavio Almeida]O desempenho está muito bom.

Coloquei mais um sistema nosso utilizando esta classe. Para os managedBeans em escopo de visão, o desempenho é melhor ainda.
[/quote]

Flavio preciso da tua ajuda,
estou com um problema relacionado a atualização do selectOneMenu mesmo depois que atualizo o campo do meu managedBean, estou usando seu converter.

Abri um tópico hoje: http://www.guj.com.br/java/237628-problema-com-hselectonemenu—projeto-com-jsf-2-e-primefaces

Pode me dar uma ajuda com isso ? Obrigado … abs…

Parabens Flavio Almeida esse conversor é muito bom mesmo,
mas eu to com um probleminha aqui talvez vc conheça uma solução.
Estou usando esse conversor dentro um componente composto, por causa disso ou sei la o que, no metodo

private Class<?> getClazz(FacesContext facesContext, UIComponent component) { return component.getValueExpression("value").getType(facesContext.getELContext()); }

ele está me retornando null, não sei se é porque esta trocando o facesContext ou coisa parecida.
Mas aí a duvida tem como eu consertar isso ou passar a classe que eu desejo para o conversor?
Obrigado.

wanderman, hoje estou muito atarefado, talvez não consigo acompanhar o post.
Coloque o código da sua página + faces-config para que eu possa dar uma olhada.

Abraço!

Opa, estou usando jsf 2 e não estou utilizando o faces-config vou colocar resumidamente os trechos do codigo então para melhor entendimento.

na minha pagina tenho a seguinte chamada ao componente que eu criei:

e o meu componente esta assim

[code]

<cc:interface>
<cc:attribute name="valor" required="true"/>
<cc:attribute name="id" required="true" />
</cc:interface>
<cc:implementation>
<div id="#{cc.clientId}">	
		<p:autoComplete value="#{cc.attrs.valor}"  completeMethod="#{utilFace.obterContas}" var="objeto" 
                         itemLabel="#{objeto.descricaoConta}" itemValue="#{objeto}">
		    <f:converter converterId="entityConverter"/>
		</p:autoComplete>
</div>
</cc:implementation>
[/code]

caso eu não use o meu componente composto e coloque o p:autocomplete direto na pagina ele consegue me trazer a classe correta ex:

<p:autoComplete value="#{contasFace.conta}" completeMethod="#{utilFace.obterContas}" var="objeto" itemLabel="#{objeto.descricaoConta}" itemValue="#{objeto}"> <f:converter converterId="entityConverter"/> </p:autoComplete>

não sei se nessa passagem de valor par ao componente ele perde a identificação da classe ou alguma coisa parecida.

Para que o código funcione, sua classe tem que estender SelectOneMenu do JSF. Por exemplo, no RF 3.X, o rich:combobox não estende SelectOneMenu, desta forma, impossibilitando o uso deste converter.

Abraço

Então com o autocomplete do primefaces ele funciona certinho se eu estiver utilizando-o na propria pagina, o problema ocorre somente quando eu utilizo-o dentro de um componente composto, não cheguei a testar mas creio q se eu criar um componente composto utilizando o SelectOneMenu ele pode gerar o mesmo problema, mas vou tentar aqui depois te falo.
Valeu

CARA VOCÊ SALVOU MEU EMPPREGO E CONSEQUENTEMENTE MINHA VIDA…OBRIGADO!!!