0

ユーザーを保持するユーザーリストページがあり、p:dataTable各行にポップアップを表示する更新ボタンがあります。p:dialogページとダイアログはビュー スコープで管理されます (Spring で実装)。

メイン ページでを押すとeditUserButton、ポップアップにすべてのデータが表示され、フィールドemailusernameに無効な文字列を入力します。検証メッセージが表示されますが、選択リストには値が入力されていません。

何が問題なのですか?

これは、メイン ページ (ユーザー リスト) のスニペット コードです。

<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:dialog コードです:

<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
    }
}
4

2 に答える 2

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 型に割り当てられます。このポップアップを閉じて再度入力すると、次のようなエラー メッセージが表示されます: no property label(value) on type of String... 顧客変数は現在文字列であるため、値もラベルもありません財産。

値とラベルが一意であると仮定し、リスト文字列の customersList タイプを設定し、customersList がラベルをバインドし、ラベルの値を見つけます。バックエンドで送信するとき。この方法で再移入例外を回避できる理由は、検証エラーが発生するかどうかに関係なく、反復子が常に文字列型であるためです。

これが必要に役立つことを願っています。

于 2013-10-10T03:36:05.673 に答える
0

最初に行うことは、メソッドselectionListenerが呼び出されていることを確認することです (メソッドにブレークポイントを設定するか、何かを出力して後でコンソールにチェックインします)。

そうである場合は、変数customersListが正しく更新されているかどうかを確認する必要があります。そうでない場合は、Bean のスコープに問題がある可能性があります。

サンプル コードでは、バッキング Bean のスコープを設定する方法が明確ではないため、Spring の XML 構成ファイルでそれを行っていると仮定します。

ビュー マップの内容を調べて、ビュー スコープにバッキング Bean があることを確認しますFacesContext.getCurrentInstance().getViewRoot().getViewMap()

それが役に立てば幸い!

于 2012-06-03T21:15:18.677 に答える