Rich:listShuttle component has invalid value expression

Pessoal, já pesquisei um monte de exemplos do GUJ, mudei a forma de fazer, e até agora não consegui resultados. De toda forma que tento fazer, ele sempre dá a mesma mensagem. Até substitui o bean de valor por um string simples pra ver se resolvia, mas não deu certo.

Código JSF

                <rich:listShuttle  var="item"                                   
                                   sourceValue="#{grupoUsuario.acessos}"
                                   targetValue="#{grupoUsuario.acessosGrupo}"
                                   fastOrderControlsVisible="false"
                                   orderControlsVisible="false"
                                   converter="AcessoConverter"
                                   id="acessoGrupo"
                                   >
                    <rich:column>
                        <h:outputText value="#{item}" id="desc_acesso"/>
                    </rich:column>
                </rich:listShuttle>

Meu bean

@Entity
@Table(name = "ACESSO")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Acesso.findAll", query = "SELECT a FROM Acesso a"),
    @NamedQuery(name = "Acesso.findByNrAcesso", query = "SELECT a FROM Acesso a WHERE a.nrAcesso = :nrAcesso"),
    @NamedQuery(name = "Acesso.findByDsAcesso", query = "SELECT a FROM Acesso a WHERE a.dsAcesso = :dsAcesso")})
public class Acesso implements Serializable, IPojo {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "NR_ACESSO")
    private Integer nrAcesso;
    @Basic(optional = false)
    @Column(name = "DS_ACESSO")
    private String dsAcesso;

    public Acesso() {
    }

    public Acesso(Integer nrAcesso) {
        this.nrAcesso = nrAcesso;
    }

    public Acesso(Integer nrAcesso, String dsAcesso) {
        this.nrAcesso = nrAcesso;
        this.dsAcesso = dsAcesso;
    }

    public Integer getNrAcesso() {
        return nrAcesso;
    }

    public void setNrAcesso(Integer nrAcesso) {
        this.nrAcesso = nrAcesso;
    }

    public String getDsAcesso() {
        return dsAcesso;
    }

    public void setDsAcesso(String dsAcesso) {
        this.dsAcesso = dsAcesso;
    }

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

    @Override
    public boolean equals(Object object) {        
        if (!(object instanceof Acesso)) {
            return false;
        }
        Acesso other = (Acesso) object;
        if ( (this.nrAcesso == null && other.nrAcesso != null) || 
             (this.nrAcesso != null && !this.nrAcesso.equals(other.nrAcesso))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.viena.bean.Acesso[ nrAcesso=" + nrAcesso + " ]";
    }

}

O trecho relevante do managed bean

package br.com.viena.jsf.beans;

public class GrupoUsuarioBean {
    private Integer nrGrupo;
    private String dsGrupo;
    private Date dtCadastro;
    private Integer nrUsuarioCad;
    private Date dtAlteracao;
    private Integer nrUsuarioAlter;
    private String nomeUsuario;
    private ArrayList<GrupoUsuario> gruposUsuario;
    private ArrayList<String> acessos;
    private ArrayList<String> acessosGrupo;


  

    public ArrayList<String> getAcessos() {
        AcessoBO regra = new AcessoBO();
        try {
            //acessos = regra.listarNaoAcessoGrupo(nrGrupo);
            acessos = new ArrayList<String>();
            if (nrGrupo == null) {
                return null;
            } else {
                for (Acesso item : regra.listarNaoAcessoGrupo(nrGrupo)) {
                    acessos.add(item.getDsAcesso());
                }
                return acessos;
            }
        } catch (Exception ex) {
            Logger.getLogger(GrupoUsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public ArrayList<String> getAcessosGrupo() {
        AcessoBO regra = new AcessoBO();
        acessosGrupo = new ArrayList<String>();
        try {
            if (nrGrupo == null) {
                return null;
            } else {
                for (Acesso acesso : regra.listarAcessoGrupo(nrGrupo)) {
                    acessosGrupo.add(acesso.getDsAcesso());
                }
                return acessosGrupo;
            }
        } catch (Exception ex) {
            Logger.getLogger(GrupoUsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    public void setAcessosGrupo(ArrayList<String> acessosGrupo) {
        this.acessosGrupo = acessosGrupo;
    }
}

Como estou trabalhando só com string agora, retirei o converter, mas mesmo colocando ele e declarando no faces-config, não funcionava, embora entrasse e executasse o converter corretamente.

Não queria implementar isso na mão, não pode ser tão difícil assim de descobrir :cry:

Olá marcosalex, estou com o mesmo problema e já tentei com string tb e nada, mesmo erro…
vc conseguiu resolver?
abs

O problema está no equals, reescreva-o, pois ele não cobre todas as possibilidades, veja o caso onde o object ou this for null, além disso evite usar == ou = para comparar objetos, use sempre obj.equals(), esse último você já fez.