绑定时JSF抛出参数类型不匹配

时间:2010-11-29 21:09:14

标签: java jsf binding richfaces

我正在尝试执行以下操作:当用户在rich:calendar组件中输入值时,h:inputText应将其required归因设置为true 。我按照这篇文章中的说明进行操作:Reference JSF control's attributes via JavaScript

很抱歉用于创建其他帖子,但我无法弄清楚如何将代码发布到评论区域并使其可读。该页面抛出此错误:

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>

如果h:inputText对象有值,如何使rich:calendar成为必需项?有一种方法可以使用日历的binding属性来执行此操作,但我不确定如何在c:forEach内执行此操作。我不能在这个项目中使用AJAX。感谢。

2 个答案:

答案 0 :(得分:2)

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:repeat仅在HTML呈现器中重复)。这意味着您无法使用建议的方法。然后,所有组件将共享相同的绑定,这是错误的。最好的方法是将UIComponent(更精确的UIInput)属性添加到oc后面的对象并绑定到它,以便每个组件都有自己唯一的绑定。 E.g。

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>

(请注意,我简化了required rich:calendar属性的EL,因为它已经返回了boolean

答案 1 :(得分:1)

为什么日历上的值和组件绑定都指向同一个el表达式?您不能在类型为date的richfaces日历上进行组件绑定。

另外,您是否尝试过使用ui:repeat而不是c:foreach?

http://www.ilikespam.com/blog/c:foreach-vs-ui:repeat-in-facelets

c:已知foreach在与jsf和jsp生命周期不匹配相关的facelets上下文中给出问题。有关详细信息,请查看上面的帖子。