Rich:listShuttle - Estou quase desistindo [RESOLVIDO] não desisto mais

Pessoal, vou postar todo o meu código aqui para utilização do listShuttle, não é possível que esse componente foi criada para nada…

Me ajudem a fazer funcionar…

Quero listar um cadastro de empresas… e selecioná-las em um formulário de agrupamento…

Segue abaixo o código JSP:

[code]
<rich:listShuttle id = “lsEmpresas”
converter = “EmpresaConverter”
showButtonLabels = “false”
sourceCaptionLabel = “.::Empresas disponíveis”
sourceListWidth = “245”
targetCaptionLabel = “.::Empresas selecionadas”
targetListWidth = “245”
listsHeight = “250”
sourceValue = “#{MetaVigenciaMB.empresas}”
targetValue = “#{MetaVigenciaMB.empresasSelecionadas}”
var = “empresas” >

				   		<rich:column>
				   		   <h:outputText value="#{empresas.id}" />
				   		</rich:column>
				   						   								   						   			
				   		<rich:column>
				   		   <h:outputText value="#{empresas.descricao}" />
				   		</rich:column>

				    </rich:listShuttle>            						
			  	 </center>

[/code]

Estou utilizando um conversor para converter id que é do tipo Long para String.

Segue abaixo:

[code]public class EmpresaConverter implements Converter {

@Override
public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String valorTela) {
	// TODO Auto-generated method stub
	
	if (valorTela == null){
		
		return null;
		
	}
	
	EmpresaDAO empresaDAO = new EmpresaDAO();
	EmpresaBean empresaBean = empresaDAO.getEmpresa(new Long(valorTela));
	return empresaBean;
	
}

@Override
public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object objetoTela) {
	// TODO Auto-generated method stub
	
	if (objetoTela==null){
		
		return null;
		
	}
	
	if (objetoTela instanceof EmpresaBean){
		
		EmpresaBean empresaBean = (EmpresaBean) objetoTela;								
		return empresaBean.getId().toString();   
		
	} else {
	
		throw new IllegalArgumentException("object:" + objetoTela + "of type:" + objetoTela.getClass().getName());
		
	}		 	
}

}[/code]

[code]O método empresaDAO.getEmpresa(Long valor) retorna um objeto do tipo bean, e está como segue:

public EmpresaBean getEmpresa(Long id){

	Iterator<EmpresaBean> iterator = this.session.createCriteria(EmpresaBean.class).add(Restrictions.like("id", id)).list().iterator();
	
	EmpresaBean empresaBean = new EmpresaBean();
	if (iterator.hasNext()){
	
		empresaBean = iterator.next();
		
	}		
	
	this.session.close();
	
	return empresaBean;
	
}

[/code]

Agora, após fazer tudo isso, de nada resolve… Os erros permanecem os mesmos, toda a requisição ajax na tela aparece o seguinte erro:

[color=red]Component frmMetaVigencia:lsEmpresa has invalid value expression br.com.web.bean.EmpresaBean@1294813"[/color]

Alguém pode me ajudar… estou algum tempo tentando resolver…

Obrigado a todos…

Cara, desculpe a pergunta, vc declarou este converter la no seu faces-config?

Ow Luciano… foi mal… declarei sim…

<converter> <converter-id>EmpresaConverter</converter-id> <converter-class>br.com.eucatur.vieweb.converter.EmpresaConverter</converter-class> </converter>

Quando eu depuro, o converter é chamado e é dado retorno…

Essa declaração esta certa???

Se eu mudo o retorno do método getAsObject da minha classe de conversão para null a mensagem aparece como segue:

[color=red]“Component frmMetaVigencia:lsEmpresa has invalid value expression null”[/color]

Se eu mudo o retorno do método getAsObject da minha classe de conversão para “0” a mensagem aparece como segue:

[color=red]“Component frmMetaVigencia:lsEmpresa has invalid value expression 0”[/color]

Ou seja… valor algum atende o objeto do listShuttle…

Cara, nao sei se isso te ajuda, este e o converter do sample richfaces

[code]public class ListShuttleOptionItemConverter implements Converter {

/* (non-Javadoc)

 * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)

 */

public Object getAsObject(FacesContext context, UIComponent component,

		String value) {



	int index = value.indexOf(':');

	

	return new ListShuttleOptionItem(value.substring(0, index), Integer.valueOf(value.substring(index + 1)));

}



/* (non-Javadoc)

 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)

 */

public String getAsString(FacesContext context, UIComponent component,

		Object value) {



	ListShuttleOptionItem optionItem = (ListShuttleOptionItem) value;

	return optionItem.getName() + ":" + optionItem.getPrice();

}

}[/code]

Nossa hehe… me explica o que você fez… :smiley:

Por que você utilizou um índice do valor???

Você está utilizando um conversor de horas e minutos???

Obrigado pela ajuda amigo…

Nao cara, este e o exemplo do richfaces, mandei no seu e-mail o exemplo completo, parece que no value do objeto ele seta com index:String, ou seja 0:MeuItem0, 1:MeuItem2

Entendi… bah vou dar uma olhada…

Desculpa de encher ai Luciano… hehe

Qualquer coisa eu te dou um grito… valew

Vai outro exemplo um pouco diferente

http://javaplace.blogspot.com/2008_02_01_archive.html

Eu tento utilizar a Classe ListShuttleOptionItem mas não encontro nas bibliotecas do meu projeto… Eu devo importar mais algum pacote para o mesmo???

Tentei utilizar o HtmlListShuttle mas não funciona…

Aqui na empresa não estou conseguindo ter acesso aos links que vc me passou…

Cara o ListShuttleOptionItem e um bean do projeto que enviei ao teu email, ele serve apenas para fornecer valores para o exemplo

Cara, uma pergunta basica, o teu bean Empresa implementa equals e hashCode, havia esquecido este detalhe esqueca tudo que eu postei se vc nao estiver implementado estes metodos

Não…

Está assim:

[code]@Entity
@Table(name=“empresa”)
public class EmpresaBean {

@Id
@GeneratedValue
@Column(name="codigo")
private Long id;	
private String descricao;

public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}
public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}

}
[/code]

Ai cara, so implementa o equals e hashCode e testa seu projeto como vc tava fazendo, sem nada do que eu postei, ai acho que funciona, blz,

no meu projeto esta assim

	@Override

	public int hashCode() {

		final int prime = 31;

		int result = 1;

		result = prime * result

				+ ((descricao == null) ? 0 : descricao.hashCode());

		return result;

	}







	@Override

	public boolean equals(Object obj) {

		if (this == obj)

			return true;

		if (obj == null)

			return false;

		if (getClass() != obj.getClass())

			return false;

		Departamento other = (Departamento) obj;

		if (descricao == null) {

			if (other.descricao != null)

				return false;

		} else if (!descricao.equals(other.descricao))

			return false;

		return true;

	} 



	public String toString(){

		return this.descricao;

	}

para o meu equals funcionar eu tive que implemetar o toString tambem, Ok

:smiley: Vou testar…

Fiz assim:

[code]@Entity
@Table(name=“empresa”)
public class EmpresaBean {

@Id
@GeneratedValue
@Column(name="codigo")
private Long id;	
private String descricao;

public Long getId() {
	return id;
}
public void setId(Long id) {
	this.id = id;
}
public String getDescricao() {
	return descricao;
}
public void setDescricao(String descricao) {
	this.descricao = descricao;
}

public int hashCode(){

	final int prime = 31;
	int result = 1;
	result = prime * result + ((id==null) ? 0 : id.hashCode());
	
	result = prime * result + ((descricao==null) ? 0 : descricao.hashCode());
	
	return result;
	
}

public boolean equals(Object obj){
	
	if (this == obj) return true;
	if (obj == null) return false;
	if (getClass() != obj.getClass()) return false;
	
	final EmpresaBean other = (EmpresaBean) obj;
	
	if (id == null){
		
		if (other.id != null) return false;
		
	} else if (!id.equals(other.id)) return false;
	
	if (descricao==null){
		
		if (other.descricao != null) return false;			
		
	} else if (!descricao.equals(other.descricao)) return false;
	
	return true;
	
}

}
[/code]

OOOw luciano…

Te devo uma pedra das graaaaande… hehehe funcionandinho bonito…

Obrigado mesmo cara… o que vc fez poucos fazem… obrigado por me ensinar a resolver esse problema…

Quando precisar estarei a disposição…

edit: desculpem, não tinha visto o post da segunda página, só tinha sugerido o picklist do richfaces.

Cara, desculpe ai pelas outras informacoes, e que as vezes o problema esta tao na cara que a gente demora a perceber e acaba viajando.

lucianotome blza?javascript:emoticon(’:D’);
Cara teria como vc enviar o exemplo completo deste componente para o meu email tbm, estou precisando urgente para ver
no que estou errando, pois nao estou conseguindo setar os selecionados (acredito que seja ou no converter ou na implementação do hashcode e equals do objeto).
Agradeço desde já. Meu email eh hersilio@gmail.com :smiley:

Estou com o mesmo problema, não estou conseguindo setar os objetos…
Será que alguém poderia postar um exemplo de como alterar a lista do
listShuttle do richfaces ?