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

19 respostas
shadowzaum

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">

19 Respostas

M

obrigatoriamente tem que passar.

shadowzaum

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.

E

coloca to string so no label

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

shadowzaum

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.
	}
E

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?

shadowzaum

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.

E

Debug e ve exatamente a linha que está dando erro

shadowzaum

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.

Guilherme_Gomes

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

shadowzaum

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.

E

faz um teste ai.

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

shadowzaum

erickfm8:
faz um teste ai.

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

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

rafaelvascon

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

shadowzaum

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

}
E

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…

shadowzaum

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…

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.

rafaelvascon

(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.

shadowzaum

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.

rafaelvascon

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

Criado 4 de outubro de 2011
Ultima resposta 5 de out. de 2011
Respostas 19
Participantes 5