В настоящее время я работаю над небольшим инструментом для голосования с помощью JSF, Primefaces, CDI и т. Д. Основная цель этого - улучшить мои навыки программирования и немного узнать о Java EE.JSF + Primefaces, SelectOneListBox не работает
В инструменте можно собирать компьютерные игры и создавать игровые голосования, где люди (Lan-Party) могут (или должны быть способны) голосовать за игру. Для формы голосования я хочу использовать Primefaces «SelectOneListBox». Он получает список игр от @ApplicationScoped Bean, что Handels голосования («votingListProducer») и выглядит следующим образом:
<h:form id="votingFormID">
<p:selectOneListbox value="#{votingListController.selectedGame}" converter="#{gameConverter}"
var="g" showCheckbox="true" style="width:500px;" >
<f:selectItems value="#{votingListProducer.voting.gameList}" var="game" itemLabel="#{game.name}" itemValue="#{game}" />
<p:column>
<p:graphicImage value="resources/images/#{g.imgSrc}" width="40"/>
</p:column>
<p:column>
#{g.name}
</p:column>
<p:column>
#{g.version}
</p:column>
</p:selectOneListbox>
<p:commandButton value="Submit" action="#{votingListController.doAddVoteAktion}" />
<p:commandButton value="Zeige selektierte List" action="#{votingListController.doPrintSelectedGame}"/>
</h:form>
Когда я называю эту точку зрения, отображается правильный список игр. Но когда я выбираю один и нажимаю «Отправить», конвертер преобразует его правильно, потому что он возвращает правильную Игру, но в Контроллере атрибут «selectedGame» не будет установлен в эту Игру. А также методы не называются.
Вот контроллер:
@SessionScoped
@Named
public class VotingListController implements Serializable{
private static final long serialVersionUID = -7222543653854660316L;
private Game selectedGame;
@Inject @AddedChoice
private Event<Game> addChoiceEventSrc;
public void doAddVoteAktion(){
if (selectedGame!=null){
addChoiceEventSrc.fire(selectedGame);
}
}
public void doPrintSelectedGame(){
if (selectedGame!=null){
System.out.println(selectedGame.getName());
}
}
public Game getSelectedGame() {
return selectedGame;
}
public void setSelectedGame(Game selectedGame) {
this.selectedGame = selectedGame;
}
}
У вас есть идея, почему это не работает?
Спасибо!
Edit: конвертер-код
@RequestScoped
@Named
public class GameConverter implements Converter{
@Inject
private GameListManager gameListManager;
@Override
public Object getAsObject(FacesContext fc, UIComponent ui, String value) {
for (Game g : gameListManager.getGameList()){
if (g.getGameId().toString().equalsIgnoreCase(value)){
System.out.println ("I receive: "+g.getName());
return g;
}
}
return null;
}
@Override
public String getAsString(FacesContext fc, UIComponent ui, Object value) {
if (value!=null){
Game game = (Game) value;
String res = game.getGameId().toString();
System.out.println(res);
return res;
}
return null;
}
}
Наиболее вероятной причиной, почему действие поддержка компонент не будет называться, если проверка и/или преобразование из строя. Убедитесь, что преобразование и проверка правильности выполняются должным образом; поместите компонент ' ' на свою страницу или загляните в консоль javascript в своем браузере, чтобы подтвердить –
kolossus
. Пожалуйста, пройдите по причинам, перечисленным в ответе http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not -being-invoked и соответствующим образом обновить ваш вопрос. – BalusC
Я добавил сообщение-тег, и проблема, похоже, является ошибкой проверки. После отправки формы он говорит: «Значение недействительно». Я где-то читал, что это может иметь какое-то отношение к тому, что я использую «@PersistenceContext» для ввода EntityManager в моем безгражданном компоненте, который передает игры в БД? – JuHarm89