簡體   English   中英

JSF 在綁定時拋出參數類型不匹配

[英]JSF throws argument type mismatch when binding

我正在嘗試執行以下操作:當用戶在rich:calendar組件中輸入一個值時, h:inputText應將其required屬性設置為true 我正在按照這篇文章中的說明進行操作: 通過 JavaScript 引用 JSF 控件的屬性

很抱歉創建另一篇文章,但我不知道如何將代碼發布到評論區並使其可讀。 該頁面拋出此錯誤:

javax.el.ELException: /pages/overtime/overtime-n.xhtml @121,65 binding="#{oc.overtimeDate}": java.lang.IllegalArgumentException: argument type mismatch

問題是綁定在c:forEach循環內,我正在嘗試使用循環變量進行綁定。 overtime.overtimeItems被定義為一個ArrayList<OvertimeComponent> ,每個 OvertimeComponent 對象都具有各種屬性( overtimeDateovertimeDateIdidovertimeHours等)。

<c:forEach items="#{overtime.overtimeItems}" var="oc">
  <rich:calendar value="#{oc.overtimeDate}" 
    requiredMessage="Date 1 is required."
    id="#{oc.overtimeDateId}" 
    binding="#{oc.overtimeDate}" 
    required="#{oc.id == 1 ? true : false}">
  </rich:calendar>
  <h:inputText value="#{oc.overtimeHours}" 
    id="#{oc.overtimeHoursId}"
    requiredMessage="Hours is required." 
    required="#{not empty oc.overtimeDate.value}" >
  </h:inputText>
  .....
</c:forEach>

如果rich:calendar對象有值,我如何使h:inputText必需? 有一種方法可以使用日歷的binding屬性來執行此操作,但我不確定如何在c:forEach 我不能在這個項目中使用 AJAX。 謝謝。

binding屬性應該指向UIComponent ,而不是像Date這樣的值對象。 如果您沒有使用c:forEach ,您上一個問題中的答案會起作用。

<rich:calendar value="#{oc.overtimeDate}" 
    requiredMessage="Date 1 is required."
    id="#{oc.overtimeDateId}" 
    binding="#{calendarComponent}" 
    required="#{oc.id == 1 ? true : false}">
</rich:calendar>
<h:inputText value="#{oc.overtimeHours}" 
    id="#{oc.overtimeHoursId}"
    requiredMessage="Hours is required." 
    required="#{not empty calendarComponent.value}" >
</h:inputText>

上面的示例將組件綁定到“頁面范圍”,而不是特定的 bean,因為您通常對 bean 內部的組件不感興趣。 您可以隨意命名#{calendarComponent} 您可以在同一頁面的任何位置以相同的名稱訪問它。

但是,在您的特定情況下,您使用的是c:forEach而不是ui:repeat ,因此組件實際上在組件樹中ui:repeatui:repeat僅在 HTML 渲染器中重復)。 這意味着您不能使用建議的方法。 然后所有組件將共享相同的綁定,這是錯誤的。 最好將UIComponent (更准確地說, UIInput )屬性添加到oc后面的對象並綁定到它,以便每個組件都有自己唯一的綁定。 例如

public class OvertimeComponent {
    private UIInput calendarComponent;
    // ...

<rich:calendar value="#{oc.overtimeDate}" 
    requiredMessage="Date 1 is required."
    id="#{oc.overtimeDateId}" 
    binding="#{oc.calendarComponent}" 
    required="#{oc.id == 1}">
</rich:calendar>
<h:inputText value="#{oc.overtimeHours}" 
    id="#{oc.overtimeHoursId}"
    requiredMessage="Hours is required." 
    required="#{not empty oc.calendarComponent.value}" >
</h:inputText>

(請注意,我簡化了rich:calendar required屬性的 EL,因為它已經返回了一個boolean

為什么日歷上的值和組件綁定都指向同一個 el 表達式? 您不能在類型為 date 的 Richfaces 日歷上進行組件綁定。

另外,您是否嘗試過使用 ui:repeat 而不是 c:foreach ?

https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

眾所周知,c:foreach 會在與 jsf 和 jsp 生命周期不匹配相關的 facelets 上下文中出現問題。 查看上面的帖子以獲取更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM