2014-01-17 33 views
1

我目前正在与JSF,Primefaces,CDI等一起使用小型投票工具......其主要目的是提高我的编程技能并学习一些关于Java EE的知识。JSF + Primefaces,SelectOneListBox不能正常工作

在该工具中,可以收集PC游戏并创建游戏投票,其中人们(Lan-Party)可以(或应该能够)为游戏投票。 对于投票表单,我想使用Primefaces“SelectOneListBox”。它让游戏从@ApplicationScoped豆是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; 
} 

} 

你有任何想法,为什么这不起作用?

谢谢!

编辑:转换码

@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

最可能的原因支持bean行动将不会被调用是,如果验证和/或转换失败。验证转换和验证是否正确发生;在您的页面上放置一个''组件或在浏览器的javascript控制台中查看以确认 – kolossus

+0

请解决http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not中列出的原因 - 被调用并相应地更新您的问题。 – BalusC

+0

我添加了一个消息标签,问题似乎是一个验证错误。提交表单后,它会显示:“价值无效”。我在某处读到,这可能与我使用“@PersistenceContext”在我的无状态Bean中注入EntityManager的事实有关,它在数据库中管理游戏? – JuHarm89

回答

-1

尝试:

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

也许这可能是一个错误,当你调用转换器的getAsObject,你可以发布转换器的代码?

+0

我添加了转换器代码。正如你所看到的转换,使用“GameListManager”,它包含了DB中的所有游戏。另外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"/>