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á.