<rich:listShuttle help

19 respostas
F

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

F
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!!

F

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

'[]

A

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.

G

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

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.

G

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.

A

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;
G

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?

A

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

C

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

A

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.

C

“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:

A

You are welcome.

P

Bom akila,

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

A

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