Converter com SelectOneMenu

7 respostas
lblanco

Boa noite Senhores,

Gostaria de uma ajudinha de vocês. Tenho o seguinte mapeamento:

package br.com.uspedra.model.as;
 
import java.io.Serializable;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
 
@Entity
@Table(name = "assistema")
 
  @NamedQueries({
  @NamedQuery(name="AsSistema.searchAll",     query="select e from AsSistema e "),
  @NamedQuery(name="AsSistema.searchById",    query="select e from AsSistema e where e.idSistema = :idSistema")
})
 
public class AsSistema implements Serializable {
 
    @Id    
    @Column(name = "id_sistema", nullable = false)
    private String idSistema;
 
    @Column(name = "descricao", nullable = false)
    private String descricao;
 
    @Column(name = "usuario_responsavel", nullable = false)
    private String usuarioResponsavel;
 
    @Column(name = "fg_bloqueio", nullable = false)
    private String fgBloqueio;
 
    @Column(name = "bk_ordem", nullable = false)
    private int bkOrdem;
 
    @Column(name = "bk_consist", nullable = false)
    private String bkConsist;
 
    @Column(name = "tp_bloqueio", nullable = true)
    private String tpBloqueio;
 
    @Column(name = "fg_terceiro", nullable = false)
    private String fgTerceiro;
    
    @OneToMany( mappedBy="sistema" )   
    private List<AsOperacao> asOperacaoList;
    
    @OneToMany( mappedBy="sistema" )   
    private List<AsModulo> asModuloList;
 
    public AsSistema() {
    }

    public String getIdSistema() {
        return idSistema;
    }

    public void setIdSistema(String idSistema) {
        this.idSistema = idSistema;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public String getUsuarioResponsavel() {
        return usuarioResponsavel;
    }

    public void setUsuarioResponsavel(String usuarioResponsavel) {
        this.usuarioResponsavel = usuarioResponsavel;
    }

    public String getFgBloqueio() {
        return fgBloqueio;
    }

    public void setFgBloqueio(String fgBloqueio) {
        this.fgBloqueio = fgBloqueio;
    }

    public int getBkOrdem() {
        return bkOrdem;
    }

    public void setBkOrdem(int bkOrdem) {
        this.bkOrdem = bkOrdem;
    }

   
    public String getTpBloqueio() {
        return tpBloqueio;
    }

    public void setTpBloqueio(String tpBloqueio) {
        this.tpBloqueio = tpBloqueio;
    }

    public String getFgTerceiro() {
        return fgTerceiro;
    }

    public void setFgTerceiro(String fgTerceiro) {
        this.fgTerceiro = fgTerceiro;
    }

    public List<AsOperacao> getAsOperacaoList() {
        return asOperacaoList;
    }

    public void setAsOperacaoList(List<AsOperacao> asOperacaoList) {
        this.asOperacaoList = asOperacaoList;
    }

    public List<AsModulo> getAsModuloList() {
        return asModuloList;
    }

    public void setAsModuloList(List<AsModulo> asModuloList) {
        this.asModuloList = asModuloList;
    }

    public String getBkConsist() {
        return bkConsist;
    }

    public void setBkConsist(String bkConsist) {
        this.bkConsist = bkConsist;
    }

}

Para esse mapeamento tenho o seguinte DAO

package br.com.uspedra.dao.as;

/* Imports */
import br.com.uspedra.model.as.AsSistema;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

/* DAO */
public class AsSistemaDao {
    
    /* Objetos necessarios */
    private AsSistema            asSistema;
    private List                 asSistemaList;
    private EntityManager        em;
    private EntityManagerFactory emf;
    
    /** Metodo responsavel por executar a query no objeto */
    public List searchAll() {

        /* Acessa a namedQuery */
        try {
            /* Instancia objetos */
            emf = Persistence.createEntityManagerFactory("webHDPU");
            em = getEntityManager();
            Query query = (Query) em.createNamedQuery("AsSistema.searchAll");
            this.setAsSistemaList(query.getResultList());
        } finally {
            em.close();
            emf.close();
        }
        return this.asSistemaList;
    }

    
    /* Metodo responsavel por buscar todos os registros da tabela */
    public List selectItems() {
        try {

            /* Variaveis necessárias */
            List         lAsSistema = this.searchAll();
            ListIterator iAsSistema = lAsSistema.listIterator();
            List ret                = new ArrayList();

            /* Abrindo o LIST e instanciando o RET com os valores String */
            while (iAsSistema.hasNext()) {

                AsSistema asSistemaItem = (AsSistema) iAsSistema.next();
                SelectItem si = new SelectItem();                
                si.setValue(asSistemaItem);
                si.setLabel(asSistemaItem.getDescricao());
                ret.add(si);
            }

            return ret;

        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }
    
    public EntityManager getEm() {
        return em;
    }

    public void setEm(EntityManager em) {
        this.em = em;
    }

    public EntityManagerFactory getEmf() {
        return emf;
    }

    public void setEmf(EntityManagerFactory emf) {
        this.emf = emf;
    }

    /* Criando o Controler com JPA */
    private EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public AsSistema getAsSistema() {
        return asSistema;
    }

    public void setAsSistema(AsSistema asSistema) {
        this.asSistema = asSistema;
    }

    public List getAsSistemaList() {
        return asSistemaList;
    }

    public void setAsSistemaList(List asSistemaList) {
        this.asSistemaList = asSistemaList;
    }
}

Observem que no momento em que eu monto a minha lista de selectItem eu seto o objeto como sendo o ID.

si.setValue(asSistemaItem);
si.setLabel(asSistemaItem.getDescricao());
ret.add(si);

Agora tenho o seguinte managed-bean:

public class AsController {

    /*Atributos necessarios*/
    private        AsChamado          asChamadoCtr      = null;
    private        List                      asSistemaList         = null;
    private        AsSistema            asSistema;

     /*Monta a lista de select items*/
    public String selectItemsAsSistema(){
      try{
        AsSistemaDao sisDao = new AsSistemaDao();
        this.setAsSistemaList(sisDao.selectItems());
        return "selectItemsAsSistemaSucess";        
      }catch(Exception ex){
          ex.printStackTrace();
          return "selectItemsAsSistemaError";
      }
    }   
    
    // Gets e Sets

Dessa forma tenho o seguinte JSP:

<h:selectOneMenu  id="sistema" label="#{bundle.textSistema}" value="#{AsController.asSistema}" >
  <f:selectItems value="#{AsController.asSistemaList}" />
</h:selectOneMenu>

Contudo, quando tento persistir o objeto recebo a seguinte mensagem de erro:

Alguém poderia me ajudar ? Existe uma forma simples de resolver esse problema ?
Andei lendo alguma coisa mas tudo parece confuso. Onde está o erro ?
Obrigado a todos.

7 Respostas

lblanco

Vamo lá moçada. Em 3 minutos voces resolvem o meu problema que já duram 3 dias… dá uma forcinha ai… eu sei que voces sabem como resolver !!!

Obrigaduu !!!

lidianycs

Olha só, vc tem que criar uma classe converter, que vai converter o valor do selectOne de string pra objeto e vice versa, e depois mapear esse converter no faces-config.xml.
Acho que se vc pesquisar sobre converter aq mesmo vai descobrir como fazer, mas qualquer coisa, se vc não encontrar posso ajudar.
Boa sorte!
:wink:

lblanco

Opa !

Muito obrigado, vou pesquisar.
Você tem algum exemplo de converter ?

Obrigado pela atenção.

vanilton.coelho

Cara, vc tem certeza que dentro de asSistemaList só tem SelectItem ??? porque o selectOneMenu só lista coleção que tenham esses objetos, e outra:

no value do selectOneMenu, aqui:

value="#{AsController.asSistema}"

não pode comportar um OBJETO não, o intuito dele não é esse, dentro do selectOneMenu vc tem uma lista de SelectItem, estes tem um par de valores, ID e Descricao, vc tem que entender que o dado que vc selecionar, pegará o ID daquele item que vc escolheu e irá mapear para dentro do selectOneMenu, mas a intenção é passar o ID, o coerente seria algo do tipo:

value="#{AsController.asSistema.id}" ou ID ou CODIGO ou sei lá qual seja o nome de seu atributo que vc queira mapear.

Lá no seu managed bean, já de posse do ID, vc faz oque vc quizer, sacou???

lidianycs

É mesmo, parece qe está ao contrário, acho que ficaria assim:

<h:selectOneMenu id="sistema" label="#{bundle.textSistema}" value="#{AsController.asSistemaList}" > <f:selectItems value="#{AsController.asSistema}" /> </h:selectOneMenu>

vanilton.coelho

acredito que ainda não seja assim, o valor mapeado no selectOneMenu deve se ter em mente que será o recebido do ID de um selectItem, ou seja, a lista que está em &lt;f:selectItems value="#{AsController.asSistema}" /&gt;

não sei se a lista é asSistema, mas tem que ser uma lista de SelectItem devidamente preenchida.

lidianycs

Aqui vai um exemplo

<h:selectOneMenu value="#{UserBean.userGroup}" >                      
                       <f:selectItems value="#{UserBean.allUserGroup}" /> 
</h:selectOneMenu>

O método UserBean.allUserGroup:

public SelectItem[] getAllUserGroup() {
        
        List<UserGroup> userGroups = userManager.getAllUserGroup();
        
        SelectItem select[] = new SelectItem[userGroups.size()];
        int i = 0;
        for(UserGroup userGroup : userGroups ) {
            select[i++] = new SelectItem( userGroup );
        }
        
        return select;
    }
Lembrando que vc tem que criar e mapear um converter. Espero ter ajudado

:)

Criado 30 de julho de 2008
Ultima resposta 5 de ago. de 2008
Respostas 7
Participantes 3