2013-12-22 78 views
1

我在一個可編輯的數據表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中添加的文件的情況下工作?

回答

1

我解決了它通過實現另一個轉換器擴展EntityConverter並檢查ID是否爲空。這就是我的代碼:

@FacesConverter(value = "anotherConverter") 
public class AnotherConverter extends EntityConverter { 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object value) { 
     if (value instanceof Document && ((Document) value).getId() == null) { 
      return String.valueOf(((Document) value).hashCode()); 
     } 
     return super.getAsString(context, component, value); 
    } 
} 
2

而不是你自己的自定義converter,試試這個generic converter這將適用於一切。

import java.util.Map; 
import java.util.Map.Entry; 
import java.util.UUID; 
import java.util.WeakHashMap; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.convert.Converter; 
import javax.faces.convert.FacesConverter; 

@FacesConverter(value = "entityConverter") 
public class EntityConverter implements Converter { 

    private static Map<Object, String> entities = new WeakHashMap<Object, String>(); 

    @Override 
    public String getAsString(FacesContext context, UIComponent component, Object entity) { 
     synchronized (entities) { 
      if (!entities.containsKey(entity)) { 
       String uuid = UUID.randomUUID().toString(); 
       entities.put(entity, uuid); 
       return uuid; 
      } else { 
       return entities.get(entity); 
      } 
     } 
    } 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent component, String uuid) { 
     for (Entry<Object, String> entry : entities.entrySet()) { 
      if (entry.getValue().equals(uuid)) { 
       return entry.getKey(); 
      } 
     } 
     return null; 
    } 

} 
+0

感謝您的回覆。我試過你的通用轉換器,但不幸的是uuid字符串仍爲空... – joshi737

+0

然後你在XHTML文件中有一些問題。 – Makky

+0

但在某些文件被添加之前,對於那些在表中的文件,它不是零... – joshi737