我目前正在与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;
}
}
最可能的原因支持bean行动将不会被调用是,如果验证和/或转换失败。验证转换和验证是否正确发生;在您的页面上放置一个' '组件或在浏览器的javascript控制台中查看以确认 –
kolossus
请解决http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not中列出的原因 - 被调用并相应地更新您的问题。 – BalusC
我添加了一个消息标签,问题似乎是一个验证错误。提交表单后,它会显示:“价值无效”。我在某处读到,这可能与我使用“@PersistenceContext”在我的无状态Bean中注入EntityManager的事实有关,它在数据库中管理游戏? – JuHarm89