p:pickList在按下p:commandButton后没有获取数据

时间:2012-06-03 13:11:36

标签: spring jsf-2 primefaces

我有一个用户列表页面,该页面将用户保存在p:dataTable中,并且每行中都有一个显示p:dialog弹出窗口的更新按钮。 页面和对话框在视图范围内管理(在Spring中实现)。

当我按下主页面中的editUserButton时,弹出窗口会显示所有数据,然后我会在字段电子邮件用户名中键入无效字符串。将显示验证消息,但选项列表未填充任何值。

可能是什么问题?

这是主页(用户列表)代码段:

<ui:composition>
<f:view id="bodyView">
    <div id="content_body">
        <ui:include src="editUserDialog.xhtml"/>
        <h:form id="usersListForm">
        <table width="85%" align="center">
            <tr>
                <td>
                    <p:dataTable id="usersList" var="user" 
                             value="#{usersController.usersList}"
                             selectionMode="single"
                             rowKey="#{user.userId}">
                        <p:columnGroup type="header">
                            <p:row>
                                ...
                                <p:column rowspan="2" headerText="Users"/>
                                ...
                            </p:row>
                        </p:columnGroup>
                            ...
                        <p:column id="users" >
                            <p:commandLink id="editUserButton" oncomplete="addEditUserConfirmation.show()" actionListener="#{addEditUserController.selectionListener}"
                                    update=":addEditCustomerDialogForm:dialogContent">
                                    <f:attribute value="#{user}" name="selectedUser" />
                            </p:commandLink>
                        </p:column>
                    </p:dataTable>
                </td>
            </tr>
        </table>
        <br/>
        </h:form>
    </div>
</f:view>

这是p:对话框代码:

<ui:composition>
<h:form id="addEditUserDialogForm">
        <p:dialog id="addEditUserDialog" severity="alert" widgetVar="addEditUserConfirmation" draggable="true" modal="true"
              resizable="false" >
        <p:outputPanel id="dialogContent">
        <div>
            <table cellpadding="5">
                <tr>
                    <td>
                        <p:inputText value="#{addEditUserController.addEditCustomerBean.userName}"
                                maxlength="250" size="50" label="user name" id="userName">
                            <f:validator validatorId="UsernameValidator"/>
                        </p:inputText>
                        <p:message for="userName"/>
                    </td>
                </tr>
                <tr>
                    <td>
                        <p:inputText value="#{addEditUserController.addEditCustomerBean.email}"
                                maxlength="50" size="50" label="E-mail" id="email">
                            <f:validator validatorId="EmailValidator"/>
                        </p:inputText>
                        <p:message for="email"/>
                    </td>
                </tr>
            </table>
            <table cellpadding="5">
                <tr>
                    <td>
                        <p:pickList id="customersList" iconOnly="true"
                                    value="#{addEditUserController.customersList}" var="customer"
                                    itemValue="#{customer.value}" itemLabel="#{customer.label}"/>
                    </td>
                </tr>
            </table>
        </div>
        <div align="right">
            <p:commandButton value="#{isNewUser ? 'add' : 'update'}" id="updateUserButton"
                                         actionListener="#{addEditUserController.persistUser}"
                                         update="dialogContent"
                                         styleClass="fiftyone-default-button"
                                oncomplete="handleRequest(xhr, status, args)"/>
        </div>
        </p:outputPanel>
</p:dialog>
</h:form>
<script type="text/javascript">
    function handleRequest(xhr, status, args) {
        if(!(args.validationFailed &amp;&amp; args.validationFailed == true)) {
            addEditUserConfirmation.hide();
        }
    }
</script>

这是支持bean代码:

import org.primefaces.model.DualListModel; 
import javax.annotation.PostConstruct;
import javax.faces.event.ActionEvent;
import java.util.List;

public class AddEditUserController {
   private AddEditCustomerBean addEditCustomerBean;
   private DualListModel<LabelValueBean> customersList;

   // ... constructor getters and setters

   public void selectionListener(ActionEvent event) throws Exception {
        selectedUser = event.getComponent().getAttributes().get("selectedUser");
        // some code
        AddEditCustomerBean = new AddEditCustomerBean();
        // some code
        customersList = getSomeCustomersDualListModel()
    }

    public void persistUser() throws Exception {
       // save user to DB
    }
}

2 个答案:

答案 0 :(得分:0)

我要做的第一件事就是确保调用方法selectionListener(要么在其上放置一个断点,要么打印一些内容并稍后在控制台中检查)。

如果是,则必须检查变量customersList是否正确更新,如果不正确,则可能存在bean范围问题。

在您的示例代码中,您不清楚如何设置辅助bean的范围,因此我假设您在Spring的XML配置文件中执行此操作。

通过检查视图中的内容,确保视图范围内确实有支持bean:FacesContext.getCurrentInstance().getViewRoot().getViewMap()

希望它有所帮助!

答案 1 :(得分:0)

这是一个老问题,但我最近也遇到过这个问题,现在又无奈了。我们来看看p:pickList:

                <td>
                    <p:pickList id="customersList" iconOnly="true"
                                value="#{addEditUserController.customersList}" var="customer"
                                itemValue="#{customer.value}" itemLabel="#{customer.label}"/>
                </td>

我们知道[var =“customer”]是一个迭代器,但是当验证错误发生时,这个var被分配给String类型,这是奇怪的。当您关闭此弹出窗口然后再次重新填充它时,您将收到错误消息,如下所示:对于String类型没有属性标签(值)... customer var现在是一个String,因此它没有值也没有标签属性。

现在,我使用一种棘手的方法,它总是不会有效,这取决于你的代码:  假设值和标签是唯一的,设置CustomersList类型的List String,customersList绑定标签,在后端提交时找到标签的值;为什么这种方式可以避免重新填充异常,这是因为迭代器始终是String的类型,无论是否发生验证错误。

希望这有助于满足需求。