<rich:listShuttle help

19 respostas
fabioebner

alguem ja usou tenho o seguinte jsf:

<rich:listShuttle sourceValue="#{montaCombo.bairroAtuacao}" 
                    targetValue="#{pessoa.bairroAtuacao}" 
                    var="items" 
                    sourceCaptionLabel="Bairros" 
                    targetCaptionLabel="Bairro de Atuação">
            <rich:column>
                    <h:outputText value="#{items.nomeBairro}"></h:outputText>
            </rich:column>
        </rich:listShuttle>
o seguinte pessoaBean:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.dnasolution.bean;

import br.com.dnasolution.db.Conexao;
import br.com.dnasolution.objetos.BairroAtuacao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Administrador
 */
public class PessoaBean {

    private String nome = blank;
    private String telefone = blank;
    private String telefoneComercial = blank;
    private String telefoneCelular = blank;
    private String email = blank;
    private String ocupacaoPessoa = blank;
    private int codigoOcupacao = 0;
    private int codigoRegiao = 0;
    private int codigoPartido = 0;
    private int codigoPessoa = 0;
    private int codigoInstituicao =0;
    private String result_inserir = blank;
    public static final String SUCESSO_INSERCAO = "success_pessoa";
    public static final String FALHA_INSERCAO = "failure_pessoa";
    static Connection con = null;
    static PreparedStatement pStm = null;
    static ResultSet rs;
    static private String blank = "";
    private List<BairroAtuacao> bairroAtuacao = new ArrayList<BairroAtuacao>();
    private String nomeBairro;

    public void setNomeBairro(String nomeBairro) {
        this.nomeBairro = nomeBairro;
    }

    public String getNomeBairro() {
        return nomeBairro;
    }
    

    public List<BairroAtuacao> getBairroAtuacao() {
        return bairroAtuacao;
    }

    public void setBairroAtuacao(List<BairroAtuacao> bairroAtuacao) {
        this.bairroAtuacao = bairroAtuacao;
    }
    public PessoaBean() {


    }

    public int getCodigoPessoa() {
        return codigoPessoa;
    }

    public void setCodigoPessoa(int codigoPessoa) {
        this.codigoPessoa = codigoPessoa;
    }

    public String getOcupacaoPessoa() {
        return ocupacaoPessoa;
    }

    public void setOcupacaoPessoa(String ocupacaoPessoa) {
        this.ocupacaoPessoa = ocupacaoPessoa;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getTelefoneComercial() {
        return telefoneComercial;
    }

    public void setTelefoneComercial(String telefoneComercial) {
        this.telefoneComercial = telefoneComercial;
    }

    public String getTelefoneCelular() {
        return telefoneCelular;
    }

    public void setTelefoneCelular(String telefoneCelular) {
        this.telefoneCelular = telefoneCelular;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getCodigoInstituicao() {
        return codigoInstituicao;
    }

    public void setCodigoInstituicao(int codigoInstituicao) {
        this.codigoInstituicao = codigoInstituicao;
    }

    
    public String inserir() {
   ................
    }
    
    public void selecionaPessoa(ActionEvent evt){
 .........
    }

    public int getCodigoOcupacao() {
        return codigoOcupacao;
    }

    public void setCodigoOcupacao(int codigoOcupacao) {
        this.codigoOcupacao = codigoOcupacao;
    }

    public int getCodigoRegiao() {
        return codigoRegiao;
    }

    public void setCodigoRegiao(int codigoRegiao) {
        this.codigoRegiao = codigoRegiao;
    }

    public int getCodigoPartido() {
        return codigoPartido;
    }

    public void setCodigoPartido(int codigoPartido) {
        this.codigoPartido = codigoPartido;
    }
}
o montaComboBean:
public Collection getBairroAtuacao() {
        Collection toReturn = new ArrayList();
        SelectItem ae = new SelectItem();
        
        try {
            Connection conexao = Conexao.getInstancia().conectarDb();
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM tb_bairro");


            while (rs.next()) {
                toReturn.add(new BairroAtuacao(rs.getInt("cd_bairro"), rs.getString("nm_bairro")));
            }
        } catch (Exception e) {

        }
        return toReturn;
    }
e o BairroAtuacao:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.dnasolution.objetos;

/**
 *
 * @author Fabio Ebner
 */
public class BairroAtuacao {
    private int codigoBairro;
    private String nomeBairro;

    public void setCodigoBairro(int codigoBairro) {
        this.codigoBairro = codigoBairro;
    }

    public BairroAtuacao(int codigoBairro, String nomeBairro) {
        this.codigoBairro = codigoBairro;
        this.nomeBairro = nomeBairro;
    }

    public void setNomeBairro(String nomeBairro) {
        this.nomeBairro = nomeBairro;
    }

    public String getNomeBairro() {
        return nomeBairro;
    }

    public int getCodigoBairro() {
        return codigoBairro;
    }

    
    public BairroAtuacao() {
    }

}

ele mostra na tela. consigo jogar um para um lado e outro para o outro legal. mas qdo eu dou por exemplo inserir e le me retorna o seguinte erro:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: /cadastro_auxiliar/adicionar_bairro_pre_candidato.jsp(25,20) '#{items.nomeBairro}' Property 'nomeBairro' not found on type java.lang.String
javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)

root cause

org.apache.jasper.el.JspPropertyNotFoundException: /cadastro_auxiliar/adicionar_bairro_pre_candidato.jsp(25,20) '#{items.nomeBairro}' Property 'nomeBairro' not found on type java.lang.String
org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:104)
javax.faces.component.UIOutput.getValue(UIOutput.java:173)
com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:189)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:320)
com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:200)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:833)
org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:286)
org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
org.richfaces.renderkit.ListShuttleRendererBase.encodeOneRow(ListShuttleRendererBase.java:183)
org.richfaces.renderkit.AbstractRowsRenderer.process(AbstractRowsRenderer.java:87)
org.richfaces.model.ListShuttleDataModel.walk(ListShuttleDataModel.java:56)
org.ajax4jsf.component.UIDataAdaptor.walk(UIDataAdaptor.java:994)
org.richfaces.renderkit.AbstractRowsRenderer.encodeRows(AbstractRowsRenderer.java:107)
org.richfaces.renderkit.ListShuttleRendererBase.encodeRows(ListShuttleRendererBase.java:100)
org.richfaces.renderkit.html.ListShuttleRenderer.doEncodeChildren(ListShuttleRenderer.java:244)
org.richfaces.renderkit.html.ListShuttleRenderer.doEncodeChildren(ListShuttleRenderer.java:234)
org.richfaces.renderkit.ListShuttleRendererBase.encodeChildren(ListShuttleRendererBase.java:227)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
org.ajax4jsf.renderkit.RendererBase.renderChild(RendererBase.java:282)
org.ajax4jsf.renderkit.RendererBase.renderChildren(RendererBase.java:262)
org.richfaces.renderkit.html.ModalPanelRenderer.doEncodeChildren(ModalPanelRenderer.java:351)
org.richfaces.renderkit.html.ModalPanelRenderer.doEncodeChildren(ModalPanelRenderer.java:346)
org.ajax4jsf.renderkit.RendererBase.encodeChildren(RendererBase.java:121)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:809)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:244)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:175)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
Apache Tomcat/6.0.14

nao entendi o pq.. pelo q ele falae ae ele nao acha a propriedade nomeBairro.. mas aonde eu tenho q ter essa propriedade. pq isso e apenas o q eu estou mostrano e um outputText..
alguem pode me ajudar por favor?

19 Respostas

F

Amigo, estou tentando usar o listShuttle mas nem entrar na tela n consigo, dá logo um erro:
No tag “listShuttle” defined in tag library imported with prefix “rich”

estou declarando assim no jsp:

<%@taglib prefix=“rich” uri=“http://richfaces.org/rich”%>
<f:view>
<rich:listShuttle

no jsp nao dá problema nenhum, mas quando executo dá esse erro a cima, o .jar que uso é
richfaces-impl-3.1.3.GA.jar
richfaces-api-3.1.3.GA.jar
richfaces-ui-3.1.3.GA.jar

pode me dá uma ajuda??

fabioebner
Fernandes no meu esta configurado assim:
<%@ taglib uri="http://richfaces.ajax4jsf.org/rich" prefix="rich"%>
e no web.xml o seguinte:
<filter>
        <display-name>Ajax4jsf Filter</display-name>
        <filter-name>ajax4jsf</filter-name>
        <filter-class>org.ajax4jsf.Filter</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>ajax4jsf</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>

se estiver tudo feito assim. tenta colocar ele dentro de uma tag form
e se nao me engano tive q pegar a commons-collections-3.2.jar tbm tenta isso

valeus

F

Fabio,

Mas qual foi a versao do seus jar’s richfaces?

Obrigado pela atenção!!

fabioebner

todos 3.1.3.GA

F

Fabio,
deu tudo certinho agora!!!
vc conseguio resolver o problema que vc postou??

muito obrigado!!!

F

Fabio,
estou c/ o mesmo problema seu :slight_smile:
vc ja conseguio resolver??

'[]

Akila

Pessoal, como vc estão usando um bean nas suas listas, vcs devem implementar um converter para po bean e referenciado no listShuttle no atributo converter=“idDoConverter”. Ai isso vai funcionar.

Mas depois disse tem outro probrema que eu estou. Quando eu muda os itens de um lugar para o outro, qunado vou submeter ele da erro de

“has invalid value expression br.ufmg.lcc.perfil.dto.Usuario@1180935”

Não sei como ajustar isso.

gustavodelgado

No caso do Fabio, acho que o problema é a falta do Converter mesmo.

Akila, vc conseguiu resolver o seu? Eu consegui implementar aqui, e inclusive ele preenche a lista de destino corretamente quando dou submit, porém o mesmo erro que aconteceu com vc ocorre quando dá algum erro de validação em qualquer outro campo do form, e depois eu tento submeter de novo. Se não der nenhum erro de validação, funciona perfeitamente. Não sei o motivo disso…

Se o pessoal de cima precisar, segue um exemplo de conversor:

public class GrupoConverter implements Converter {
    GrupoService grupoService = (GrupoService)CreateService.getService(GrupoService.class);
    
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {

        if (value == null){
            return null;
        }
        
        Grupo grupo = grupoService.selectById(new Integer(value));
        return grupo;
    }

    public String getAsString(FacesContext context, UIComponent component,
            Object value) {

        if (value == null){
            return null;
        }
        
        Grupo grupo = (Grupo) value;
        return grupo.getIdGrupo().toString();
    }
}
Akila

Eu fui para outro caminho, removi o converter e estou usando lista de string.

A minha lista tem o id da minha entidade e existe uma outra estrutura de dados, Map<String, Entidade> que contem a chave e o valor, entidade que deveria esta no listshuttle.

Então, par apopular as colunas do listshuttle eu uso a chave de cara iteração e recupero a entidade do meu map.

Ai não da problema, porem, tenho o trabalho de tratar o resto.

gustavodelgado

Mas no sourceValue e no targetValue do listShuttle vc coloca os Map ou os List? Teria como vc postar o código do listShuttle e também o Map e o List?
Obrigado.

Akila

O source e o target vc usa a lista de string. List<String>.
O Map, deve possuir todo os itens que estão na lista de String.

&lt;rich:listShuttle id="escolhaAnuncianteInterno" sourceValue="#{anuncianteInternoArg.usuarios}"
					targetValue="#{anuncianteInternoArg.usuariosSelecionados}" var="item" fastMoveControlsVisible="false"
					fastOrderControlsVisible="false" orderControlsVisible="false" sourceCaptionLabel="#{msgs.usuarios}"
					targetCaptionLabel="#{msgs.usuariosParaInclusao}" copyControlLabel="#{msgs.buttonAdicionar}"
					removeControlLabel="#{msgs.buttonRemover}"&gt;
					&lt;rich:column&gt;
						&lt;h:outputText value="#{anuncianteInternoArg.mapUsuario[item].name}" /&gt;
					&lt;/rich:column&gt;
				&lt;/rich:listShuttle&gt;
gustavodelgado

Estou tentando implementar isso, mas não deu muito certo ainda. Fiz um Map pra testar, assim:

private Map<String, Pais> mapTeste = new HashMap<String, Pais>();

    public Map<String, Pais> getMapTeste() {
        Iterator i = getDisponiveis().iterator();
        Pais pais;
        while (i.hasNext()){
            pais = new Pais();
            pais.setIdPais(new Integer(i.next().toString()));
            pais.setNome("pais "+i.next().toString());
            mapTeste.put(pais.getIdPais().toString(), pais);
        }
        return mapTeste;
    }

A lista chamada disponíveis é minha List que tá no sourceValue. Está correto isso?
Ele está montando o listShuttle na tela, mas alguns itens aparecem e outros não (parece que ele não encontra o “SessionBean.mapTeste[items].nome”
E também dá algum erro no componente na primeira vez que abro a tela (não consigo selecionar os itens). Quando fecho e abro de novo, aí funciona.

Alguma idéia?

Akila

É isso mesmo que vc deveria fazer. Verifica se tem alguma coisa errada com o seu map e a lista do source. Eu fiz isso mesmo e funcionou. Faz o seguinte teste. Exiba na lista não o conteudo do map, apenas a valor da lista de string. E verifica se esses valores tem no seu map como chave.

contrabando

fala galera, caso alguém chegue até aqui novamente:
-eu “consegui” fazer usando List mesmo,
-criando o converter muito parecido com o que o nosso amigo aqui em cima passou,
-e implementei o método equals da minha entidade.

O único problema que estou tendo que posso cadastrar o mesmo cara duas vezes,
tipo cadastro ele e salvo ai depois vou pra página de edição novamente
ele mostra na lista de disponíveis novamente a posso cadastrá-lo outra vez.

alguém pode ajudar???

valew

Akila

Para você fazer isso tera de tratar os valores da sua lista fonte. Não tem outra forma mesmo. No meu caso, eu apenas fiz uma validação se o valor escolhido já existe no alvo. Não fiquei preoculpado de não exibir o valor novamente, mas para isso basta remove-lo da lista de fonte no momento no qual você recupera/monta sua lista.

contrabando

“que paia heim”(ele não fazer isto automático)…

então eu vou trazer a lista já sem os dados que meu objeto possui…

valew Akila :slight_smile:

Akila

You are welcome.

Psytheory

Bom akila,

será que você teria um exemplo de listshuttle usando o Map ou os List para postar ?

Akila

Tenho sim, mas esta em casa e eu estou no trabalho no momento. Hoje a noite eu posto aqui um exemplo, se eu demorar me manda um e-mail, eu acabo esquecendo as coisas.

Criado 30 de janeiro de 2008
Ultima resposta 6 de ago. de 2009
Respostas 19
Participantes 6