[Resolvido] Duvida sobre JSF e entidades com metodo toString. (JSF 2.0 + Primefaces 2.2)

Espero que essa duvida alguem me responda, pois as ultimas duas só renderam visualizações.

Bom, estou com uma entidade que tem o metodo toString(), que alterei para mostrar apenas um atributo.

A minha duvida é a seguinte, no caso abaixo. Quando indico o “users” como label e value, ele não deveria retornar o metodo toString()? Ou obrigatoriamente tenho que passar algo para ele retornar?

<p:pickList id="picklist"
                 value="#{projetoController.dualListProjetos}"  
                 var="users"  
                 itemLabel="#{users}"  
                 itemValue="#{users}"
                 addLabel="#{msgs['action.add']}"
                 addAllLabel="#{msgs['action.addAll']}"
                 removeLabel="#{msgs['action.remove']}"
                 removeAllLabel="#{msgs['action.removeAll']}"
                 required="true">

obrigatoriamente tem que passar.

Pois é, mas se coloco o "#{users.toString()} eu consigo carregar a pagina normal. Mas dai da o seguinte erro na hora de salvar:

java.lang.ClassCastException: java.lang.String cannot be cast to *****.entity.Usuario

E caso eu não coloque, a pagina nem carrega. Da o seguinte erro:

*****.entity.Usuario cannot be cast to java.lang.String

É isso que ta pegando.

coloca to string so no label

itemValue="#{users}" , pois no value ele vai tentar converte o toString que é String para a Entidade

Está dando a mesma coisa:

*****.entity.Usuario cannot be cast to java.lang.String

Eu vou ter que fazer alguma annotation na entidade pra indicar o metodo toString()?

Código do metodo toString()

	@Override
	public String toString() {
		return nome; //onde nome é um atributo String da entidade.
	}

Não precisa de anotação.

dualListProjetos é uma lista de usuario?

<p:pickList id="picklist"   
                 value="#{projetoController.dualListProjetos}"     
                 var="users"     
                 itemLabel="#{users.toString}"     
                 itemValue="#{users}"   
                 addLabel="#{msgs['action.add']}"   
                 addAllLabel="#{msgs['action.addAll']}"   
                 removeLabel="#{msgs['action.remove']}"   
                 removeAllLabel="#{msgs['action.removeAll']}"   
                 required="true">  

vc fez assim?

Sim, dualListProjetos é uma lista de usuarios. Na realidade é uma lista “dupla” de usuario, é coisa do primefaces.
O nome ficou meio confuso, mas é sim.

E sim, fiz do jeito que você falou, com toString(), passando diretamente um atributo String do usuario. Enfim, tentei varias coisas diferentes. Mas no final ou ele da erro na hora de salvar ou na hora de mostrar.

Debug e ve exatamente a linha que está dando erro

Não sei se vai ajudar na sua visão ai do projeto. Mas aqui no outro tópico, tenho maior parte do código.

Ele vai usar o toString mesmo.
O problema é que ele não sabe como retornar aquele valor String de volta para um objeto Usuário. Afinal, ele não tem informações suficientes para isso.
Você deve usar um conversor pra isso, da uma olhadinha aqui

Beleza, vou dar uma olhada. Caso resolva, você resolveu dois dias de dor de cabeça em 3 linhas.

Valeu a ajuda ai galera, agora vou entender como fazer esse conversor e então posto os resultados.

faz um teste ai.

itemLabel="#{users.nome}"
itemValue="#{users}"

[quote=erickfm8]faz um teste ai.

itemLabel="#{users.nome}"
itemValue="#{users}" [/quote]

Já fiz, como havia dito. E continua dando o mesmo erro. Vou tentar usar o converter que o Guilherme Gomes falou.

Posta aí a parte do código em que o dualListProjetos é declarado.

Abaixo o código, vou botar com todas as annotations.

public class ProjetoController extends BaseController {

	@EJB
	private ProjetoService projetoService;
	@EJB
	private UsuarioService usuarioService;
	private ListDataModel<Projeto> projetos;
	private Projeto projeto = new Projeto();
	private DualListModel<Usuario> dualListProjetos;
	private List<Usuario> target;
	private List<Usuario> source;

	
	public void setDualListProjetos(DualListModel<Usuario> dualListProjetos) {
		this.dualListProjetos = dualListProjetos;
	}

	public DualListModel<Usuario> getDualListProjetos() {
		if (projeto.getUsuarios() == null) {
			this.target = new ArrayList<Usuario>();
		} else this.target = projeto.getUsuarios();

		this.source = usuarioService.listAll();
		this.source.removeAll(this.target);
		dualListProjetos = new DualListModel<Usuario>(source, target);
		return dualListProjetos;
	}

// getters and setters

}

Mano presta atenção

vc falo que tinha feito assim

itemLabel="#{users.toString}"
itemValue="#{users}"

eu falei pra vc fazer assim

itemLabel="#{users.nome}"
itemValue="#{users}"

blzz…

[quote=erickfm8]Mano presta atenção

vc falo que tinha feito assim

itemLabel="#{users.toString}"
itemValue="#{users}"

eu falei pra vc fazer assim

itemLabel="#{users.nome}"
itemValue="#{users}"

blzz…

[/quote]

Então como disse antes, eu já fiz das seguintes maneiras:

itemLabel="#{users.toString}"
itemLabel="#{users.nome}"
itemLabel="#{users.toString()}"
itemLabel="#{users}"

Mesma coisa com o itemValue. Dependendo de como faz, só muda a ordem do erro. Desculpa se não fui claro no post, mas era isso que queria informar.

(Vou postar meio doido pq já tá na hora de sair do trabalho)

Pro teu caso, segue esses exemplos:
http://code.google.com/p/primefaces/source/browse/examples/trunk/showcase/src/main/java/org/primefaces/examples/view/PickListBean.java
http://www.primefaces.org/showcase/ui/picklist.jsf
http://code.google.com/p/primefaces/source/browse/examples/trunk/showcase/src/main/java/org/primefaces/examples/domain/Player.java

<p:pickList value="#{pickListBean.players}"  
                    var="player" iconOnly="true" effect="bounce"  
                    itemLabel="#{player.name}"  
                    itemValue="#{player}" converter="player"  
                    showSourceControls="true" showTargetControls="true">  
        
</p:pickList> 

Agora presta atenção que ele usa um converter, e isso pode ser o jogo.

Realmente é o converter. Cara, pior é que no exemplo tinha e eu “tirei” achando que não era nada demais.

Agora é trabalhar em cima do converter no meu projeto aqui, já fiz ele por cima e nem testei, amanhã quando chegar no trampo eu faço ele direito.

E rafaelvascon, valeu pelos links. O showcase já conhecia, utilizo bastante junto do guide do primefaces. Mas o outro dos exemplos completos eu não conhecia, realmente vai ser de grande ajuda daqui pra frente.

Valeu a todos que ajudaram ai, e desculpa qualquer coisa.

Aqui o converter se alguém tiver o mesmo problema:
http://code.google.com/p/primefaces/source/browse/examples/trunk/showcase/src/main/java/org/primefaces/examples/view/PlayerConverter.java