Я использую Primefaces selectManyCheckbox в редактируемой таблице данных подобной этой. Когда пользователь нажимает кнопку редактирования, он может выбирать между различными документами в столбце документов. Это мой код. Обратите внимание на конвертер, который я использую:
<p:dataTable id="tbl" styleClass="fixedLayoutTable no-highlight dblclick-edit edit-commit-others"
value="#{cc.attrs.manager.mg}" var="mg"
emptyMessage="#{msgs.noManager}" editable="true" widgetVar="tbl">
<p:column headerText="Documents">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{msgs.noDocs}" rendered="#{mg.docs.size() == 0}" />
<h:outputText value="#{mg.docs.toArray()[0].fileName}" rendered="#{mg.docs.size() > 0}" />
</f:facet>
<f:facet name="input">
<p:selectManyCheckbox id="chkDoc"
value="#{mg.docs}" layout="pageDirection"
converter="myConverter" collectionType="java.util.HashSet">
<f:selectItems value="#{cc.attrs.manager.docs}"
var="d" itemValue="#{d}" itemLabel="#{d.fileName}" />
</p:selectManyCheckbox>
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
В другой вкладке приложения (давайте назовем ее Tab1) пользователь может загружать некоторые документы. Эти документы были добавлены в cc.attrs.manager.docs
-список в компоненте поддержки, но еще не будут сохранены в базе данных. Если пользователь загружает некоторые документы в Tab1 и переходит на Tab2 (вкладку с данными), он должен иметь возможность выбирать между всеми документами, включая недавно добавленные. Таким образом, пользователь нажимает кнопку редактирования, и все документы появляются в поле SelectManyCheckbox. Если пользователь выбирает эти документы и щелкает, вызывается ✔-Подписать мой конвертер.
Я следовал этому примеру для реализации преобразователя. Вот фрагмент кода этого класса:
@FacesConverter(value="myConverter")
public class MyConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (component instanceof PickList) {
return getAsObject((PickList)component, value);
} else {
return SelectItemsUtils.findValueByStringConversion(context, component, value, this);
}
}
}
Это работает нормально, пока пользователь не проверит недавно добавленные документы. Если он проверит один из новых документов, параметр String метода getAsObject-
Method будет "нулевым". У кого-нибудь есть предложения, почему этот параметр равен нулю? Это потому, что документ еще не сохранен? Можно ли заставить это работать без сохранения документов, добавленных в Tab1?