JSF выбрасывает несоответствие типов аргументов при связывании - PullRequest
3 голосов
/ 30 ноября 2010

Я пытаюсь сделать следующее: когда пользователь вводит значение в компоненте rich:calendar, тогда для h:inputText должно быть присвоено значение required, равное true. Я следую инструкциям в этом посте: Ссылка на атрибуты элемента управления JSF через 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 имеет различные свойства (overtimeDate, overtimeDateId, id, overtimeHours и т. Д.).

<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 ]

2 голосов
/ 30 ноября 2010

Атрибут 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)

1 голос
/ 30 ноября 2010

Почему в календаре есть привязка значений и компонентов, указывающая на одно и то же выражение el? Вы не можете делать связывание компонентов в календаре richfaces с типом date.

Кроме того, вы пытались использовать ui: repeat вместо c: foreach?

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

c: foreach, как известно, создает проблемы в контексте Facelets, связанные с несовпадением жизненного цикла jsf и jsp. Посмотрите на пост выше для получения дополнительной информации.

...