2011-10-18 157 views
0

對此主題發表了一篇文章(Display values in drill-down SelectOneMenus)。我首先想到的問題是沒有連接到Object轉換器。selectOneMenu不渲染/顯示值

我有兩個selectOneMenu取決於對方,部門 - >類別。當我堅持持有部門和類別的背景業務對象時,一切都按預期工作。即使當前用戶會話終止並且用戶再次登錄並編輯以前保存的業務對象。

當實體管理器刷新對象並且用戶想要從數據庫再次顯示扇區,類別時,就會出現問題。扇區selectOneMenu顯示其值,因爲它應該,但類別selectOneMenu值不顯示。儘管支持bean具有數據庫中的正確值。

什麼使得selectOneMenu從數據庫而不是從內存中加載時不顯示某些持久化值/對象?

Edit.xhtml

<h:outputLabel value="Sector:" /> 
<h:selectOneMenu id="sectorSelector" value="#{activityController.selected.category.sector}" title="#{bundle.CreateSectorLabel_sectorName}" valueChangeListener="#{activityController.changeSectorMenu}" immediate="true"> 
      <a4j:ajax event="change" execute="@this categoryMenu" render="categoryMenu"/> 
      <f:selectItems value="#{sectorController.itemsAvailableSelectOne}"/> 
</h:selectOneMenu> 

<h:outputLabel value="Category:" /> 
    <h:selectOneMenu id="categoryMenu" value="#{activityController.selected.category}" title="#{bundle.CreateSectorLabel_sectorName}" 
     binding="#{activityController.categoryMenu}" 
      required="true" requiredMessage="#{bundle.CreateCategoryRequiredMessage_sector}">       
    <f:selectItems value="#{activityController.categorySelection}"/> 
</h:selectOneMenu> 

控制器豆爲類別

@ManagedBean(name = "categoryController") 
@SessionScoped 
public class CategoryController implements Serializable{ 

    .... 

    @FacesConverter(forClass = Category.class) 
    public static class CategoryControllerConverter implements Converter { 

     @Override 
     public Object getAsObject(FacesContext facesContext, UIComponent component, String value) { 
      if (value == null || value.length() == 0) { 
       return null; 
      } 
      CategoryController controller = (CategoryController) facesContext.getApplication().getELResolver(). 
        getValue(facesContext.getELContext(), null, "categoryController"); 
      return controller.ejbFacade.find(getKey(value)); 
     } 

     java.lang.Integer getKey(String value) { 
      java.lang.Integer key; 
      key = Integer.valueOf(value); 
      return key; 
     } 

     String getStringKey(java.lang.Integer value) { 
      StringBuffer sb = new StringBuffer(); 
      sb.append(value); 
      return sb.toString(); 
     } 

     @Override 
     public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
      if (object == null) { 
       return null; 
      } 
      if (object instanceof Category) { 
       Category o = (Category) object; 
       return getStringKey(o.getIdCategory()); 
      } 
      else { 
       throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + CategoryController.class.getName()); 
      } 
     } 
    } 

POJO對象

... 
public class Category implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Basic(optional = false) 
    @Column(name = "idCategory") 
    private Integer idCategory; 
    ... 

    @Override 
    public boolean equals(Object object) { 
     if (!(object instanceof Category)) { 
      return false; 
     } 
     Category other = (Category) object; 
     if ((this.idCategory == null && other.idCategory != null) || (this.idCategory != null && !this.idCategory.equals(other.idCategory))) { 
      return false; 
     } 
     return true; 
} 

Functon用於創建的SelectItem []數組

public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) { 

     int size = entities.size(); 
     SelectItem[] items; 
     int i = 0; 
     if (selectOne) { 
      items = new SelectItem[size + 1]; 
      items[0] = new SelectItem("", ResourceBundle.getBundle("/resources/Bundle").getString("Select_item")); 
      i++; 
     } else { 
      items = new SelectItem[size]; 
     } 

     for (Object x : entities) { 
      items[i++] = new SelectItem(x, x.toString()); 
     } 
     return items; 
    } 
的部分
+0

這表明你的'Category'丟失或損壞的'等於()'。展示下。 – BalusC

+0

類似equals()的接縫永遠不會被調用。但是該部門的確如此。此外getAsString()方法不會在Category bean類上被調用。爲什麼等於一個類而不是另一個類時被調用? – Chris

+0

這反過來表明''不包含'Category'對象作爲值。也許你通過'List '而不是'List '到你的'getSelectItems()'? – BalusC

回答

0

問題是,當用戶編輯業務對象時,我沒有正確的SelectItems集合。此外,我添加了<f:converter>來顯式調用轉換器,在getAsString()(else部分)中做了一些更改。

謝謝你的時間,並希望這篇文章對別人有用。

SelectMenuOne 

public String prepareEditOrganisationActivity() { 
     current = (Activity) organisationActivityItems.getRowData(); 
     Sector sector = current.getCategory().getSector(); 
     CategoryController categoryBean = JsfUtil.findBean("categoryController", CategoryController.class); 
     categorySelection = categoryBean.categoryItemsBySector(sector); 

     return "EditActivity"; 
} 

CategoryControllerConverter

...  
    @Override 
    public String getAsString(FacesContext facesContext, UIComponent component, Object object) { 
     if (object == null) { 
      return null; 
     } 
     if (object instanceof Category) { 
      Category o = (Category) object; 
      return getStringKey(o.getIdCategory()); 
     } 
     else { 
      Category tmp = new Category(); 
      return getStringKey(tmp.getIdCategory());     
     } 
    }