このトピックについて先に投稿しました(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;
}
これはあなたの 'Category'が見つからないか壊れているの'のequals() 'ことを示しています。それを示す。 – BalusC
カテゴリequals()のような継ぎ目が呼び出されることはありません。しかしセクターのためのものはそうです。また、getAsString()メソッドはCategory Beanクラスで呼び出されません。あるクラスでequalsが呼び出されないのはなぜですか?同じに見えるときにequalsが呼び出されないのはなぜですか? – Chris
これは、 ''に 'Category'オブジェクトが値として含まれていないことを示しています。おそらく 'List 'の代わりに 'List 'を 'getSelectItems()'に渡したでしょうか? –
BalusC