Пустой объект передан действию на повторитель шва

У меня на странице шва для строк таблицы используется такой повторитель:

<a4j:repeat id="r1279186" value="#{PatientList.entities}" var="Patient" rowKeyVar="rowIndex" >
<tr>
<td>
    <a4j:commandButton action="#{PatientAction.inject(Patient)}" id="Button_1279184059161" reRender="Button_1287648925796" limitToList="true" />
</td>
<td  >
    <span >#{Patient.name_fam}</span>
</td>
<td  >
    <span >#{Patient.name_giv}</span>
</td>
    <td>
    <s:link id="Page_1234" action="#{PatientAction.inject(Patient)}"  view="/somewhere/patient_details.seam" rendered="true" target="_blank" propagation="join" title="VIS" limitToList="true" >
    <img src="images/24x24/info.png" title="VIS" alt="VIS}" style="height: 24px;width: 24px;"/>
    </s:link>
</td>
</tr>

PatientAction - это bean-компонент с методом inject, который принимает входной объект класса Patient. PatientList.entities - это список, циклы повторителя для переменной с именем Patient, то же имя класса объекта.

Прежде чем вернуть страницу клиенту, seam отображает имя и фамилию для каждого пациента (строки) в списке и добавляет одну кнопку в первом столбце и одну ссылку в последнем.

Используя кнопку, действие выполняется, когда я нажимаю кнопку, получая в параметре inject Patient соответствующий строке, в которой я нажал кнопку. [ХОРОШО!]

Когда я использую ссылку (которую я использую для открытия новой страницы браузера, сохраняя тот же диалог), метод inject вызывается именно тогда, когда я нажимаю, но переданный параметр имеет значение null!! (Я вижу в отладке моего метода инъекции, Пациент приходит в ноль)

1 ответ

Решение

Вы не можете передать параметры <s:link/> действие из повторяющегося элемента, как указано в http://docs.jboss.org/seam/2.0.1.GA/reference/en/html/elenhancements.html

Cite:

Использовать внутри итеративных компонентов - такие компоненты, как <c:forEach/> а также <ui:repeat/> перебирайте список или массив, открывая каждый элемент списка для вложенных компонентов. Это прекрасно работает, если вы выбираете строку с помощью <h:commandButton/> или же <h:commandLink/>,

Однако, если вы хотите использовать <s:link/> или же <s:button/> Вы должны выставить предметы как DataModelи использовать <dataTable/> (или эквивалент из набора компонентов, например <rich:dataTable/>). ни <s:link/> или же <s:button/> отправьте форму (и, следовательно, создайте закладку для ссылки), поэтому требуется "магический" параметр для воссоздания элемента при вызове метода действия. Этот магический параметр может быть добавлен только тогда, когда таблица данных поддерживается DataModel используется."

Итак, вы должны использовать <h:commandLink/> вместо <s:link/>В качестве альтернативы вы можете создать ссылку для закладки следующим образом:

<s:link view="/somewhere/patient.details.xhtml">
    <f:param name="patientId" value="#{Patient.id}" />
    ...
</s:link>

Это приводит к появлению такой ссылки в HTML: /somewhere/patient_details.seam?patientId=5, Поскольку идентификатор пациента указан в ссылке, patient_details.xhtml страница имеет необходимую информацию для извлечения данных для отображения.

Для этого вам нужно поместить определение параметра в patient_details.page.xml так что значение выбирается до отображения страницы, например:

<!-- Here we use an EntityHome component, assuming Patient is a JPA entity.
     When you set the ID of an EntityHome component, it automatically triggers
     an EntityManager.find() call to retrieve the Entity from DB. -->
<param name="patientId" value="#{patientHome.id}" />
Другие вопросы по тегам