我目前正在开发一个带有JSF,Primefaces,CDI等的小型投票工具......其主要目的是提高我的编程技巧并学习Java EE。
在该工具中,人们可以收集PC游戏并创建游戏投票,人们(Lan-Party)可以(或应该能够)投票购买游戏。 对于投票表单,我想使用Primefaces“SelectOneListBox”。它从@ApplicationScoped Bean获取游戏列表,其中包括投票(“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>
当我调用此视图时,会显示正确的游戏列表。但是当我选择一个然后单击“提交”时,转换器会将其转换为正确的,因为它会返回正确的游戏,但在Controller中,属性“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 :(得分:-1)
尝试:
<p:commandButton value="Submit" actionListener="#{votingListController.doAddVoteAktion}"
process=":votingFormID"/>
当你的转换器调用getAsObject时,它可能是一个错误,你可以发布转换器代码吗?
答案 1 :(得分:-1)
将您的操作侦听器定义更改为
public void doAddVoteAktion (ActionEvent event){
if (selectedGame!=null){
addChoiceEventSrc.fire(selectedGame);
}
}
并且
<p:commandButton value="Submit" actionListener="#votingListController.doAddVoteAktion}" ajax="true" process="@this"/>