JSF + Primefaces,SelectOneListBox无效

时间:2014-01-17 16:09:04

标签: jsf-2 primefaces java-ee-web-profile

我目前正在开发一个带有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;
}

 }

2 个答案:

答案 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"/>