Problemas com rich:listShuttle[RESOLVIDO]

4 respostas
cs.santos0

Iai pessual, blz?

to com um problemaço aki...to tentando a 3 dias arrumar um rich:listSuttle...ja varri a net tentando achar a solução, mas ta impossivel...minha ultima tentativa é buscar ajuda aki..senao vou ter q usar outra coisa....

ja fiz todos os passos recomendados em foruns, docs, tutoriais, e etc...e o mais fantastico é que eu tenho um exemplo que eu fiz funcionando certinho no mesmo server e na mesma app...realmente não entendo oq pode estar acontenceno..qualquer ajuda é mto mto beam vinda, seguinte:

tenho o meu bean que fica em um EJB:

public class Cardapio implements Serializable {

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

    @Column(name="car_nome", length=100)
    @NotEmpty
    private String nome;

...

@Override
    public boolean equals(Object obj) {

        if(this == obj){
            return true;
        }

        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }

        Cardapio other = (Cardapio) obj;

        if(this.id == null){
            if(other.id != null){
                return false;
            }
        }else if(!this.id.equals(other.id)){
            return false;
        }

        if(this.nome == null){
            if(other.nome != null){
                return false;
            }
        }else if(!this.nome.equals(other.nome)){
            return false;
        }
        
        return true;
    }

    @Override
    public int hashCode() {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((id==null) ? 0 : id.hashCode());
         result = prime * result + ((nome==null) ? 0 : nome.hashCode());
         return result;
    }

    @Override
    public String toString(){
        return this.id+":"+this.nome;
    }

Meu Conversor:

public class CardapioConverter implements Converter {

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

        if (value == null || (value.trim().length() == 0)) {
            return null;
        }
        
        String [] str = value.split(":");        
        return new Cardapio(new Long(str[0]), str[1]);        
    }

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

         if (value == null) {
            return null;
        }

         if(value instanceof Cardapio){
            Cardapio c = (Cardapio) value;
            return c.getId()+":"+c.getNome();        
         }else{
             throw new IllegalArgumentException(
                     "Objeto: " + value + "do tipo: " + value.getClass().getName());
         }
    }
}

e meu JSP

<rich:listShuttle id="idShuttleEntradas"
                                                  sourceValue="#{pratoDiaBean.cardEntrDisponiveis}"
                                                  targetValue="#{pratoDiaBean.cardEntrSelecionados}"
                                                  var="entrada"
                                                  listsHeight="230"
                                                  sourceListWidth="280" targetListWidth="280"
                                                  sourceCaptionLabel="Itens Registrados"
                                                  targetCaptionLabel="Itens Selecionados"
                                                  copyAllControlLabel="Copiar Todos"
                                                  copyControlLabel="Copiar"
                                                  removeAllControlLabel="Remover Todos"
                                                  removeControlLabel="Remover"
                                                  fastOrderControlsVisible="false"
                                                  orderControlsVisible="false"
                                                  converter="cardapioConverter">

                                    <rich:column width="30%">
                                        <f:facet name="header">
                                            <h:outputText value="Id"/>
                                        </f:facet>
                                        <h:outputText value="#{entrada.id}">
                                        </h:outputText>
                                    </rich:column>

                                    <rich:column width="70%">
                                        <f:facet name="header" >
                                            <h:outputText value="Nome"/>
                                        </f:facet>
                                        <h:outputText value="#{entrada.nome}"></h:outputText>
                                    </rich:column>

                                    

                                </rich:listShuttle>

Quando eu escolho os itens da lista de itens disponiveis e jogo na lista de selecionados aparece a irritante mensagem:

"Component idFormPratosDia:idShuttleEntradas has invalid value expression 1:pao de queijo"

realmente não sei oq pode estar acontecendo, ja tentei de tudo: ja implementei de outra maneira o equals e o hashCode, ja mudei o conversor, ja reeimplementei o toString...ja fiz até um outro bean, pois testei a possibilidade de como o bean estar em um ejb estar dando algum erro, porem com o bean na msm app da o mesmo erro tb....

Alguma santa alma pode me ajudar?
vlw

4 Respostas

wagner_a_lima

Algumas sugestões:

1 - Só para confirmar: você registrou o seu converter no faces-conf.xml?

2 - Coloca em seus métodos do converter alguns testes para ver se os valores do objeto estão sendo passados corretamente da view para o converter.
Ex.:

public Object getAsObject(FacesContext context, UIComponent component,  
             String value) {  
   
         if (value == null || (value.trim().length() == 0)) {  
             return null;  
         }  
           
         String [] str = value.split(":");
         Cardapio cardapio = new Cardapio(new Long(str[0]), str[1]);
         System.out.println("Codigo: " + cardapio.getId());
         System.out.println("Nome: " + cardapio.getNome());
         return cardapio;          
     }

3 - Um pouco menos provável, mas tenta ai:
Troca o seu toString() para algo do tipo (so para testar):

public String toString(){  
        return this.nome;  
}

E diz ai se alguma coisa deu certo :slight_smile:

cs.santos0

vlw pela ajuda cara…entao, ja tinha tentado tudo que vc sugeriu

  1. Sim, esta configurado no faces sim…ele ta encontrando certinho o conversor

  2. Sim, os valores dos metodos estao sendo impressos corretamente, ou seja, o meu conversor esta setando corretamento o valor do meu objeto.

  3. Este toString acredito que não faz mta diferença, pelo que eu percebi, ele é usado na mensagem de erro, pra nao imprmir Cardapio@32312…por exemplo…oq pega msm é o equals e o hashCode…

alguma outra dica, ou outra forma de fazer?
abraços

cs.santos0

Resolvi!!!

o grande problema era que meu Managed Bean estava como request…troquei para session e funcionou…ainda tenho minhas duvidas o pq disso, mas fica ai a solução…

abraços

wagner_a_lima

Uma dica: verifique se esta alteração não vai gerar outros problemas no seu sistema, pois seus objetos (desse managed bean) ficarão armazenados na sessão de cada um dos usuários do seu sistema o que terá algum impacto no consumo de memória.

Se você achar que isso pode ser um problema, uma solução bem viável é utilizar o componente a4j:keepAlive do richfaces, que faz com que o estado de seu bean seja um pouco mais longo que o request e um pouco mais curto que o session. http://livedemo.exadel.com/richfaces-demo/richfaces/keepAlive.jsf?c=keepAlive

Você poderia fazer algo assim em seu jsp para que ele conserve um pouco mais o estado de seu objeto e trocar o escopo do bean novamente para request ao invés de session:

<a4j:keepAlive beanName="pratoDiaBean"/>

Mas, tudo vai de acordo com suas necessidades.

Criado 18 de setembro de 2009
Ultima resposta 19 de set. de 2009
Respostas 4
Participantes 2