2013-03-05 35 views
0

我在一個非常標準的Java Web應用程序(jsf-2)中使用PrimeFaces,並且在將ap:autoComplete組件移入時顯示所需的消息時出現問題它自己的自定義組件..primefaces requiredMessage當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:以上消息?這是完美的工作,並顯示當值是空白,或它不通過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:消息從不顯示實際錯誤(requiredMessage或PersonConverter中設置的內容)

我已經嘗試了很多不同的變體,比如只在實現中設置id,或者僅在my:personLookup中設置id,或者兩者兼有。

有人跑過這個嗎?我在做什麼或設置錯誤?謝謝你的時間!

+0

您是否嘗試過使用'號碼:message'呢? – elias 2013-03-06 00:31:05

+0

@elias我確定有..另外我似乎無法得到** p:messages **或** h:messages **中的任何一個。 – russellelbert 2013-03-06 02:11:47

+1

爲什麼你在複合組件中有'h:message'並且在它之外?你想要哪個'message'?如果你想在複合內部使用'message',只需在''message'中將'id ='autocomplete''分配給'autocomplete'並將'for =「autocomplete''賦值。複合組件是命名容器,所以你不必擔心id的唯一性。 – partlov 2013-03-06 07:54:30

回答

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"/> 
+0

注意:在組件外部保留** h:message **,並且在調用頁面中可能無效...需要更多的研究。 – russellelbert 2013-03-06 16:57:09

相關問題