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

27 respostas
dahenz

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:

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

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

Segue abaixo:

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());
			
		}		 	
	}
}
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;
		
	}

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

27 Respostas

lucianotome

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

dahenz

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

dahenz

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…

lucianotome
Cara, nao sei se isso te ajuda, este e o converter do sample richfaces
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();

	}



}
dahenz

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…

lucianotome

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

dahenz

Entendi… bah vou dar uma olhada…

Desculpa de encher ai Luciano… hehe

Qualquer coisa eu te dou um grito… valew

lucianotome

Vai outro exemplo um pouco diferente

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

dahenz

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…

lucianotome

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

lucianotome

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

dahenz

Não....

Está assim:

@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;
	}
	
	
}
lucianotome

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

dahenz

:D Vou testar....

Fiz assim:

@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;
		
	}
	
}
dahenz

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…

fabio.massa

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

lucianotome

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.

H

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 [email removido] :smiley:

Psytheory

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 ?

J

Opa! lucianotome
Será que você poderia enviar esse tutorial ou postar por aqui msm? Vc poderia adiantar alguma coisa, como faço para remover os botões de “copiar todos” e “remover todos”
Obrigado!

EuclidesFilizola

Boa tarde pessoal,

estou com o mesmo problema.

Alguém poderia me ajudar ?

Não consigo implementar um converter para a minha listShuttle.

B

Luciano e dahenz

Favor enviar para o meu e-mail exemplo do listShuttle, to com o mesmo problema aq
[email removido]

lucianotome

Desculpe pessoal, mas eu nao tenho mais os exemplos para enviar, diga qual o seu problema, oque ocorre? talvez seja mais util identificar e tratar para melhor aprender, como o Dahenz, outra vez me desculpem por nao poder enviar os arquivos, posta ai os erros que podemos fazer juntos

B

Luciano…

To enviar os meus codigos para dar uma olhada.

Minha classe no pacote Modelo

Entity

@Table(name = “…Assuntos)

public class Assunto implements Comparable, Serializable,

ComponentViewable, ILogableEntity {
private static final long serialVersionUID = 1L;


@Column(name = "NUMR_DigitoCodigo")
private Integer digito;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "NUMG_Assunto")
private Integer id;

@Column(name = "DESC_Assunto")
private String descricao;

@Column(name = "DESC_Detalhamento", length = 300)
private String detalhamento;


@OneToMany(mappedBy = "assunto", fetch = FetchType.LAZY)
@Fetch(FetchMode.SELECT)
private Set<AssuntoTipoDocumento> assuntoTiposDocumentos; (relacionamento )

Hash e equals

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;

}
/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    final Assunto other = (Assunto) 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;
}

Na classe assuntoTiposDocumentos
Tenho somente tenho id e o restante é fk de assunto.

Hash e equals

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((id == null) ? 0 : id.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;
    AssuntoTipoDocumento other = (AssuntoTipoDocumento) obj;
    if (id == null) {
        if (other.id != null)
            return false;
    } else if (!id.equals(other.id))
        return false;
    return true;
}

Meu jsp

<rich:panel id=“panelShuttle” rendered=“true” style=“border-color:#ffffff; background-color:#ffffff”>

<rich:listShuttle

id=“ModelosSecaoListShuttle” immediate=“true”

converter=“listShuttleConverter”

style=“width: 90%;”	sourceListWidth=“325” targetListWidth=“325”

fastOrderControlsVisible=“false” orderControlsVisible=“false”

copyControlLabel="" removeControlLabel="" copyAllControlLabel=""

removeAllControlLabel="" var=“atd”

sourceCaptionLabel=“Modelos a Autorizar”

targetCaptionLabel=“Modelos Autorizados”

sourceValue="#{assuntoSecoesActions.listaSourceATD}"

targetValue="#{assuntoSecoesActions.listaTargetATD}"

rendered="#{assuntoSecoesActions.modoManter.novo}">			

<a>rich:column</a>

<h:outputText value="#{atd.label}" />

</rich:column>

<a4j:support event=“onlistchanged”

onsubmit=“if(animacao_ajax_play(this)){ setMsg(‘conteudo:assuntosSecoesForm’,‘mensagemInformacao’, ‘Por favor, Aguarde!’); return false;}”

oncomplete =“animacao_ajax_stop(this); setMsg(‘conteudo:assuntosSecoesForm’,‘mensagemInformacao’, ‘’);”/>			

</rich:listShuttle>

</rich:panel>

Tá funcionando, carregando as listas normalmente. O erro acontece quando vou salvar um itens que foi selecionado para a outra coluna.
sourceId=conteudo:assuntosSecoesForm:ModelosSecaoListShuttle[severity=(ERROR 2), summary=(“Component conteudo:assuntosSecoesForm:ModelosSecaoListShuttle has invalid value expression null”), detail=(“Component conteudo:assuntosSecoesForm:ModelosSecaoListShuttle has invalid value expression null”)]
Ou seja, qdo vai atualizar verificar que o objeto não está mais na lista source…, a qual é informa que ta null.
Estou usando tomahawk para manter os objetos na seção.

B

Meu converter

public Object getAsObject(FacesContext arg0, UIComponent arg1, String str) {
	HtmlListShuttle tmp = (HtmlListShuttle) arg1;
	Object tList = tmp.getTargetValue();
	Object sList = tmp.getSourceValue();
	
	System.out.println("String de busca-->" + str);
	System.out.println("Lista Target -->" + tList);
	
	if (tList instanceof List && sList instanceof List && str != null) {
		for (ComponentViewable cv : ((List<ComponentViewable>) tList))
			if (str.equals(cv.getLabel()))
				return cv;
		for (ComponentViewable cv : ((List<ComponentViewable>) sList))
			if (str.equals(cv.getLabel()))
				return cv;
	}
	return null;
}
B

O converter está declarado no faces.config

lucianotome

Cara, tem como vc colocar o codigo entre as tags [color=red]Code[/color], assim ta meio dificil ler.

Criado 23 de abril de 2009
Ultima resposta 15 de out. de 2010
Respostas 27
Participantes 8