2011-10-18 28 views
0

このトピックについて先に投稿しました(Display values in drill-down SelectOneMenus)。持っている問題は、私が最初に考えたようにObjectコンバーターに接続されていません。selectOneMenuは値を表示/表示しません

私はセクタ - >カテゴリによってお互いに2つの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> 

のSelectItemを作成するための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のカテゴリ

@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()); 
      } 
     } 
    } 

パートのコントローラビーン[]配列

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'が見つからないか壊れているの'のequals() 'ことを示しています。それを示す。 – BalusC

+0

カテゴリequals()のような継ぎ目が呼び出されることはありません。しかしセクターのためのものはそうです。また、getAsString()メソッドはCategory Beanクラスで呼び出されません。あるクラスでequalsが呼び出されないのはなぜですか?同じに見えるときにequalsが呼び出されないのはなぜですか? – 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());     
     } 
    } 
関連する問題