0

かなり標準的な Java Web アプリ (jsf-2) で PrimeFaces を使用していますが、ap:autoComplete コンポーネントを独自のカスタム コンポーネントに移動すると、必要なメッセージが表示されるという問題が発生しています。

まず、ページ自体にある場合の p:autoComplete - これは正常に機能しています (簡略化):

<h:panelGrid  id="newRoleAdminGrid" >

            <p:autoComplete id="newRoleAdminPerson"
                            style="position: relative; padding-right:5px"
                            value="#{roleList.newRoleAdminPerson}"
                            var="personVar" 
                            itemValue="#{personVar}" 
                            itemLabel="#{personVar.fullFamiliarName}"
                            forceSelection="true"
                            completeMethod="#{personAutoComplete.byGeneralCriteria}"
                            converter="PersonConverter"
                            minQueryLength="3"
                            maxResults="50" 
                            scrollHeight="400"
                            size="50"
                            required="true" 
                            requiredMessage="admin name is requiredd"
                            title="enter users first name, last name or login" >
            </p:autoComplete> 

            <h:message for="newRoleAdminPerson" class="redError"/>

            <p:commandButton value="add" ajax="true" 
                             update="roleAdminTable,newRoleAdminGrid"
                             id="addRoleAdminBtn"
                             actionListener="#{roleList.newRoleAdmin}"
                             style="margin:5px;"
                             icon="ui-icon-plus"/>
        </h:panelGrid>

上記の h:message を参照してください。これは完璧に機能し、値が空白の場合、または PersonConverter を渡さない場合に表示されます...

ただし、アプリ全体に同じコンポーネントがあるため、カスタム コンポーネントを作成しました。

コンポーネントは次のとおりです。

<cc:interface>
    <cc:attribute name="id" type="String" required="true" />
    <cc:attribute name="person" type="com.foo.bar.model.Person" required="true" />
    <cc:attribute name="size" type="int" required="false" default="50" />
    <cc:attribute name="required" type="boolean" required="false" default="false" />
    <cc:attribute name="requiredMessage" type="String" required="false" default="required" />
</cc:interface>

<!-- IMPLEMENTATION -->

<cc:implementation>

    <p:autoComplete id="#{cc.attrs.id}"
                    style="position: relative; padding-right:5px"
                    value="#{cc.attrs.person}"
                    var="personVar" 
                    itemValue="#{personVar}" 
                    itemLabel="#{personVar.fullFamiliarName}"
                    forceSelection="true"
                    completeMethod="#{personAutoComplete.byGeneralCriteria}"
                    converter="PersonConverter"
                    minQueryLength="3"
                    maxResults="50" 
                    scrollHeight="400"
                    size="#{cc.attrs.size}"
                    required="#{cc.attrs.required}" 
                    requiredMessage="#{cc.attrs.requiredMessage}"
                    title="enter users first name, last name or login" >
    </p:autoComplete>

    <h:message for="#{cc.attrs.id}" class="redError"/>

</cc:implementation>

コードは次のようになります (カスタム コンポーネントを使用)。

<h:panelGrid  id="newRoleAdminGrid" >

            <my:personLookup id="newRoleAdminPerson"  
                             person="#{roleList.newRoleAdminPerson}"
                             required="true" requiredMessage="#{propUtil.appShortName} Admin Name is required"/>

            <h:message for="newRoleAdminPerson" class="redError"/>

            <p:commandButton value="add" ajax="true" 
                             update="roleAdminTable,newRoleAdminGrid"
                             id="addRoleAdminBtn"
                             actionListener="#{roleList.newRoleAdmin}"
                             style="margin:5px;"
                             icon="ui-icon-plus"/>

        </h:panelGrid>

この方法で実行すると、コンポーネントが機能します-ユーザーが空白のままにするか、検証に合格しない場合、primefaces の境界線は赤くなりますが、h:message には実際のエラー (requiredMessage または PersonConverter で設定されているもの) は表示されません。

私はこれのさまざまなバリエーションを試しました。たとえば、ID を実装でのみ設定するか、my:personLookup でのみ設定するか、またはその両方を設定するなどです。

誰かがこれに遭遇したことがありますか?何かを間違って実行または設定していますか? ありがとうございます!

4

1 に答える 1

1

解決策を提供してくれた@partlovに感謝します。メッセージを正しく表示する最終的なコードは次のとおりです-

コンポーネント:

<!-- INTERFACE -->

<cc:interface>
    <cc:attribute name="person" type="com.foo.bar.model.Person" required="true" />
    <cc:attribute name="size" type="int" required="false" default="50" />
    <cc:attribute name="required" type="boolean" required="false" default="false" />
    <cc:attribute name="requiredMessage" type="String" required="false" default="required" />
</cc:interface>


<!-- IMPLEMENTATION -->

<cc:implementation>

    <p:autoComplete id="personAutoComplete"
                    style="position: relative; padding-right:5px"
                    value="#{cc.attrs.person}"
                    var="personVar" 
                    itemValue="#{personVar}" 
                    itemLabel="#{personVar.fullFamiliarName}"
                    forceSelection="true"
                    completeMethod="#{personAutoComplete.byGeneralCriteria}"
                    converter="PersonConverter"
                    minQueryLength="3"
                    maxResults="50" 
                    scrollHeight="400"
                    size="#{cc.attrs.size}"
                    required="#{cc.attrs.required}" 
                    requiredMessage="#{cc.attrs.requiredMessage}"
                    title="enter users first name, last name or login" >
    </p:autoComplete>

    <h:message for="personAutoComplete" errorClass="redError" class="redError"/>

</cc:implementation>

私のxhtmlで呼び出します:

<my:personLookup id="newRoleAdminPerson"  
                     person="#{roleList.newRoleAdminPerson}"
                     required="true" requiredMessage="Admin Name is required"/>
于 2013-03-06T16:54:58.263 に答える