Атрибут 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>
Приведенный выше пример связывает компонент с «областью действия страницы», а не с конкретным компонентом, так как обычно компонент не заинтересован внутри компонента. Вы можете назвать #{calendarComponent}
как хотите. Вы можете получить к нему доступ в любом месте на одной странице с тем же именем.
Однако в вашем конкретном случае вы используете c:forEach
, а не ui:repeat
, поэтому компоненты фактически повторяются в дереве компонентов (ui: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>
(обратите внимание, что я упростил EL атрибута required
rich:calendar
, так как он все равно возвращает boolean
)