我在一個可編輯的數據表like this one內使用Primefaces selectManyCheckbox。當用戶點擊編輯按鈕時,他可以在文檔欄中的不同文檔之間進行選擇。那是我的代碼。請注意,我用的轉換器:Primefaces selectManyCheckbox withing editable Datatable submit null to Converter
<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)的用戶都可以上傳一些文件。這些文檔被添加到支持bean中的cc.attrs.manager.docs
-List中,但不會保留在數據庫中。如果用戶上傳了Tab1中的某些文檔並轉到Tab2(帶有數據表的選項卡),他應該能夠在所有文檔(包括最近添加的文檔)之間進行選擇。所以用戶點擊編輯按鈕,所有的文檔出現在SelectManyCheckbox中。如果用戶選擇這些文檔並點擊✔-Sign我的轉換器被調用。
我跟着this example來實現轉換器。這裏是這個類的代碼片段:
@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);
}
}
}
這工作正常,直到用戶不檢查最近添加的文檔。如果他檢查其中一個新文檔,則getAsObject-
方法的字符串參數爲「null」。有沒有人有一些建議,爲什麼這個參數爲空?是因爲文件沒有被保存嗎?是否有可能在沒有保留Tab1中添加的文件的情況下工作?
感謝您的回覆。我試過你的通用轉換器,但不幸的是uuid字符串仍爲空... – joshi737
然後你在XHTML文件中有一些問題。 – Makky
但在某些文件被添加之前,對於那些在表中的文件,它不是零... – joshi737