Primefaces p:selectOneMenu não atribui valor selecionado à varável no bean

Olá pessoal,

Estou com esse problema a alguns dias e não estou conseguindo encontrar nenhuma solução. Já testei várias soluções aqui do fórum e de outros fórum e não tive sucesso.

Então resolvi criar um tópico pra ver se algum de vocês consegue me ajudar :\

O meu problema é que tenho um p:selectOneMenu que não salva a opção escolhida pelo usuário. A opção selecionada não está sendo armazenada no meu bean.

Muitas vezes quando executo o projeto, nem mesmo o valor key.name é atribuido corretamente. Acredito que o problema seja na submissão da requisição, mas infelizmente não estou conseguindo resolver.

Segue o código:

index.xhtml

<?xml version='1.0' encoding='ISO-8859-1' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition template="template.xhtml"
                xmlns="http://www.w3.org/1999/xhtml"
                xmlns:p="http://primefaces.org/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets">  


    <ui:define name="menuDireito">        
        <h:form id="form"> 
            Palavra-chave<br></br>

            <h:outputLabel for="name" style="font-weight:bold"/>  

            <p:inputText id="name" value="#{key.name}" />          

            <br></br><br></br><br></br>      
            Categoria  <br></br>    

            <p:selectOneMenu  immediate="true" value="#{autoCompleteBean.selectedPlayer}"  panelStyle="width:150px"  
                              effect="fade" var="p" style="width:180px"  filter="true" filterMatchMode="startsWith">  
                <f:selectItem itemLabel="Selecione um Player" itemValue="" />  
                <f:selectItems value="#{autoCompleteBean.players}" var="player" itemLabel="#{player.name}" itemValue="#{player.name}"/>    

                <p:column>  
                    #{p.name} - #{p.number}  
                </p:column>  
            </p:selectOneMenu>                               

            <br></br><br></br>
            <p:commandButton process="@all" value="Submit" update="display" oncomplete="PF('dlg').show()" />  

            <p:dialog header="Selected Values" modal="true" showEffect="fade" hideEffect="fade" widgetVar="dlg">  
                <h:panelGrid columns="1" id="display">  
                    <h:outputText value="Value 1: #{key.name}" />                  
                    <h:outputText value="Value 5: #{autoCompleteBean.selectedPlayer.name}" rendered="#{not empty autoCompleteBean.selectedPlayer}" />
                </h:panelGrid>  
            </p:dialog>  

       </h:form>
    </ui:define>        
</ui:composition>

PlayerConverter

import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

@FacesConverter(value = "playerConverter")

public class PlayerConverter implements Converter {

    public static List<Player> playerDB;
    
    static {
        
        playerDB = new ArrayList<Player>();

        playerDB.add(new Player("Messi", 10, "messi.jpg", "CF"));
        playerDB.add(new Player("Bojan", 9, "bojan.jpg", "CF"));
        playerDB.add(new Player("Iniesta", 8, "iniesta.jpg", "CM"));
        playerDB.add(new Player("Villa", 7, "villa.jpg", "CF"));
        playerDB.add(new Player("Xavi", 6, "xavi.jpg", "CM"));
        playerDB.add(new Player("Puyol", 5, "puyol.jpg", "CB"));
        playerDB.add(new Player("Afellay", 20, "afellay.jpg", "AMC"));
        playerDB.add(new Player("Abidal", 22, "abidal.jpg", "LB"));
        playerDB.add(new Player("Alves", 2, "alves.jpg", "RB"));
        playerDB.add(new Player("Pique", 3, "pique.jpg", "CB"));
        playerDB.add(new Player("Keita", 15, "keita.jpg", "DM"));
        playerDB.add(new Player("Adriano", 21, "adriano.jpg", "LB"));
        playerDB.add(new Player("Valdes", 1, "valdes.jpg", "GK"));
    }

    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
        if (submittedValue.trim().equals("")) {
            return null;
        } else {
            try {
                int number = Integer.parseInt(submittedValue);

                for (Player p : playerDB) {
                    if (p.getNumber() == number) {
                        return p;
                    }
                }

            } catch (NumberFormatException exception) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid player"));
            }
        }

        return null;
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent component, Object value) {
        if (value == null || value.equals("")) {
            return "";
        } else {
            return String.valueOf(((Player) value).getNumber());
        }
    }
}

AutoCompleteBean

package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.SelectEvent;

@ManagedBean(name = "autoCompleteBean")
@ViewScoped

public class AutoCompleteBean implements Serializable {

    private Player selectedPlayer;
    private List<Player> players;
    private List<Player> selectedPlayers;

    public AutoCompleteBean() {
        players = new ArrayList<Player>();
    }

    public Player getSelectedPlayer() {
        return selectedPlayer;
    }

    public void setSelectedPlayer(Player selectedPlayer) {
        this.selectedPlayer = selectedPlayer;
    }

    public List<String> complete(String query) {
        List<String> results = new ArrayList<String>();

        for (int i = 0; i < 10; i++) {
            results.add(query + i);
        }

        return results;
    }

    public List<Player> completePlayer(String query) {
        List<Player> suggestions = new ArrayList<Player>();

        for (Player p : players) {
            if (p.getName().startsWith(query)) {
                suggestions.add(p);
            }
        }

        return suggestions;
    }

    public void handleSelect(SelectEvent event) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected:" + event.getObject().toString(), null);

        FacesContext.getCurrentInstance().addMessage(null, message);
    }

    @PostConstruct
    public void init(){
         players = new ArrayList<Player>();

        players.add(new Player("Messi", 10, "messi.jpg", "CF"));
        players.add(new Player("Bojan", 9, "bojan.jpg", "CF"));
        players.add(new Player("Iniesta", 8, "iniesta.jpg", "CM"));
        players.add(new Player("Villa", 7, "villa.jpg", "CF"));
        players.add(new Player("Xavi", 6, "xavi.jpg", "CM"));
        players.add(new Player("Puyol", 5, "puyol.jpg", "CB"));
        players.add(new Player("Afellay", 20, "afellay.jpg", "AMC"));
        players.add(new Player("Abidal", 22, "abidal.jpg", "LB"));
        players.add(new Player("Alves", 2, "alves.jpg", "RB"));
        players.add(new Player("Pique", 3, "pique.jpg", "CB"));
        players.add(new Player("Keita", 15, "keita.jpg", "DM"));
        players.add(new Player("Adriano", 21, "adriano.jpg", "LB"));
        players.add(new Player("Valdes", 1, "valdes.jpg", "GK"));
    }

    public List<Player> getPlayers() {
        return players;
    }

    public void setPlayers(List<Player> players) {
        this.players = players;
    }
   
    
    public List<Player> getSelectedPlayers() {
        return selectedPlayers;
    }

    public void setSelectedPlayers(List<Player> selectedPlayers) {
        this.selectedPlayers = selectedPlayers;
    }
}

Grato desde já.

Consegui encontrar o problema, era meu converter que estava mal elaborado.

Tópico encerrado :slight_smile: