How to get value from selectOneMenu primefaces?

0

Good evening. I have a little problem chatinho about 3 days, I can not get the value of selectOneMenu for the product, for example: I have three categories of products: Tapiocas, Snacks and Beverages. When selecting one, the low select updates with the products coming from the bank, (so far, well the list appears right), but when I select the product and send the form it goes empty. I would appreciate your help.

CloseClick.xhtml

<!--   JANELA QUE VAI SE ABRIR PARA ADCIONAR UM PEDIDO  -->

    <p:dialog header="Cadastrar Pedido" 
                widgetVar="dialogGerRIns"  
                resizable="true" 
                modal="true" 
                showEffect="explode" 
                width="500">
        <p:growl id="mensagens" showDetail="true" showSummary="false" />  
          <h:form prependId="false" id="tres">

                    <h:panelGrid id="infosRIns" columns="2" cellpadding="5">
                        <p:outputLabel for="categoria" value="Categorias: " />
                        <p:selectOneMenu id="categoria" value="#{fecharConta.categoria}"    style="width:190px">
                            <p:ajax listener="#{fecharConta.onCountryChange}"  update="produtoCategoria" />
                            <f:selectItem itemLabel="Selecione Categoria" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{fecharConta.categorias}" />
                        </p:selectOneMenu>

                        <p:outputLabel for="produtoCategoria" value="Produto: " />
                        <p:selectOneMenu id="produtoCategoria" value="#{fecharConta.produtoCategoria}" converter="converterProduto" style="width:190px">
                            <f:selectItem itemLabel="Selecione Produto" itemValue="" noSelectionOption="true" />
                            <f:selectItems value="#{fecharConta.produtosCategorias}" />
                        </p:selectOneMenu>
                    </h:panelGrid>


            <p:commandButton value="Submit" update=":mensagens,:novoProduto,:tabela2" actionListener="#{fecharConta.displayLocation}" icon="ui-icon-check" />
            <p:commandButton update="" oncomplete="PF('dialogGerRIns').hide()" value="Cancelar"/>

            <p:separator />
        </h:form>

closeConta.bean

@ManagedBean
@ViewScoped
public class FecharConta implements Serializable{
// VARIAVEIS PARA MUDAR O PRODUTO DE ACORDO COM SUA CATEGORIA

    private String categoria;
    private String produtoCategoria=null;
    private Map<String,Map<String,String>> data = new HashMap<String, Map<String,String>>();
    private Map<String,String> categorias;
    private Map<String,String> produtosCategorias;    
//

@PostConstruct      
public void init(){

    categorias = new HashMap<String, String>();
    categorias.put("Tapiocas", "Tapiocas");
    categorias.put("Lanche", "Lanche");
    categorias.put("Bebidas", "Bebidas");

    // PREENCHENDO A CATEGORIA REFERENTES A TAPIOCA
        listaTapiocas = TapiocariaFacade.listarProdutoTapiocas();
        Map<String,String> map = new HashMap<String, String>();
        for (Produto produto : listaTapiocas) {
            map.put(produto.getNome(), produto.getNome().toString());   
        }
        data.put("Tapiocas", map);
    //
    // PREENCHENDO A CATEGORIA REFERENTES A LANCHES
        listaLanches =  TapiocariaFacade.listarProdutoLanches();
        map = new HashMap<String, String>();
        for (Produto produto : listaLanches) {
            map.put(produto.getNome(), produto.getNome().toString());
        }
        data.put("Lanche", map);
    //

    // PREENCHENDO A CATEGORIA REFERENTES A BEBIDAS
        listaBebidas = TapiocariaFacade.listarProdutoBebidas();
        map = new HashMap<String, String>();
        for (Produto produto : listaBebidas) {
            map.put(produto.getNome(), produto.getNome().toString());
        }
        data.put("Bebidas", map);
    //
}
// REALIZAR TROCA DO PRODUTO APOS SELECIONAR A SUA CATEGORIA
            public void onCountryChange() {
                if(categoria !=null && !categoria.equals(""))
                    produtosCategorias = data.get(categoria);
                 else
                    produtosCategorias = new HashMap<String, String>();
                }
        //  

        // ENVIANDO MENSAGEM CASO NAO SEJA SELEICONADO NENHUM PRODUTO
            public void displayLocation() {
                FacesMessage msg;
                if(produtoCategoria != null && categoria!=null){

                    System.out.println(categoria +"---"+produtoCategoria);
                    msg = new FacesMessage("Selecionado", produtoCategoria + " De " + categoria);
                    FacesContext.getCurrentInstance().addMessage(null, msg);
               }else{
                   System.out.println("nao tem nada seleciondo");
                   msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid", "Produto não selecionado!."); 

                     FacesContext.getCurrentInstance().addMessage(null, msg);
                  }
            }
            //

Product.class

public class Produto {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="produto_id")
private long id;
private String nome;
private String tipo;
private long codigo;
private double preco;

@ManyToMany(mappedBy="produto", cascade=CascadeType.REMOVE)
private List<Pedido>pedido;



public List<Pedido> getPedido() {
    return pedido;
}
public void setPedido(List<Pedido> pedido) {
    this.pedido = pedido;
}
public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getTipo() {
    return tipo;
}
public void setTipo(String tipo) {
    this.tipo = tipo;
}


public double getPreco() {
    return preco;
}
public void setPreco(double preco) {
    this.preco = preco;
}

public long getCodigo() {
    return codigo;
}
public void setCodigo(long codigo) {
    this.codigo = codigo;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((nome == null) ? 0 : nome.hashCode());
    result = prime * result + ((tipo == null) ? 0 : tipo.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Produto other = (Produto) obj;
    if (nome == null) {
        if (other.nome != null)
            return false;
    } else if (!nome.equals(other.nome))
        return false;
    if (tipo == null) {
        if (other.tipo != null)
            return false;
    } else if (!tipo.equals(other.tipo))
        return false;
    return true;
}
}
    
asked by anonymous 29.09.2015 / 01:50

2 answers

0

I solved the problem. The error was in converting and amazingly it looks like a mojarra lib update, done that ran: D. Here's the new converter:

@FacesConverter(forClass = entidades.Produto.class)
public class ConverterProduto implements Converter,Serializable {

private static final long serialVersionUID = 1L;


public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
    if (value != null && !value.isEmpty()) {
        return (Produto) uiComponent.getAttributes().get(value);
    }
    return null;
}

public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
    if (value instanceof Produto) {
        Produto entity= (Produto) value;
        if (entity != null && entity instanceof Produto && entity.getId() != null) {
            uiComponent.getAttributes().put( entity.getId().toString(), entity);
            return entity.getId().toString();
        }
    }
    return "";
    }
    
12.10.2015 / 23:11
0

Oops, my converter was missing:

@FacesConverter(value="converterProduto")
public class ConverterProduto implements Converter {

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    // TODO Auto-generated method stub
    if(value!=null && !value.equals("")){
        return TapiocariaFacade.buscarProdutoNome(String.valueOf(value));
    }
    return null;
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    // TODO Auto-generated method stub
    if(value instanceof Produto){
        Produto produto = (Produto) value;
        return String.valueOf(produto.getNome().toString());
    }
    return null;
}

}

    
29.09.2015 / 04:59