2014-01-17 4 views
1

В настоящее время я работаю над небольшим инструментом для голосования с помощью 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; 
} 

} 
+0

Наиболее вероятной причиной, почему действие поддержка компонент не будет называться, если проверка и/или преобразование из строя. Убедитесь, что преобразование и проверка правильности выполняются должным образом; поместите компонент '' на свою страницу или загляните в консоль javascript в своем браузере, чтобы подтвердить – kolossus

+0

. Пожалуйста, пройдите по причинам, перечисленным в ответе http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not -being-invoked и соответствующим образом обновить ваш вопрос. – BalusC

+0

Я добавил сообщение-тег, и проблема, похоже, является ошибкой проверки. После отправки формы он говорит: «Значение недействительно». Я где-то читал, что это может иметь какое-то отношение к тому, что я использую «@PersistenceContext» для ввода EntityManager в моем безгражданном компоненте, который передает игры в БД? – JuHarm89

ответ

-1

Try:

<p:commandButton value="Submit" actionListener="#{votingListController.doAddVoteAktion}" 
process=":votingFormID"/> 

Может быть, это может быть ошибка, когда ваш конвертер вызывает getAsObject, вы можете разместить код конвертера?

+0

Я добавил конвертер-код. Как вы видите, для преобразования используется «GameListManager», который передает все игры в БД. Также System.out дает мне правильное название игры, которое я выбрал и представил ранее. – JuHarm89

-1

Изменить действие определение Приёмник

public void doAddVoteAktion (ActionEvent event){ 
    if (selectedGame!=null){ 
     addChoiceEventSrc.fire(selectedGame); 
    } 
} 

И

<p:commandButton value="Submit" actionListener="#votingListController.doAddVoteAktion}" ajax="true" process="@this"/> 
Смежные вопросы