[英]Problems with p:orderlist and session scoped backing bean
我有一個名為MyController的會話作用域托管bean。 它引用了一個名為MyModel的POJO。 MyModel包含一些其他POJO的ArrayList,我將它綁定到ap:orderlist,如下所示:
<p:orderList value="#{myController.myModel.list}" var="item" itemValue="#{item}" converter="#{itemConverter}"">
<f:facet name="caption">some title</f:facet>
<p:column>
#{item.text}
</p:column>
</p:orderList>
我的轉換器看起來像這樣:
@ManagedBean
@RequestScoped
public class ItemConverter implements Converter {
@ManagedProperty(value="#{myController.myModel.list}")
private List<Item> list;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Iterator i = list.iterator();
int id = Integer.parseInt(value);
while (i.hasNext()) {
Object currentObject = i.next();
if (((Item) currentObject).getId() == id) {
return currentObject;
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return Integer.toString(((Item) value).getId());
}
}
我在myController中構建了一個接口和方法,以動態地將項目添加到訂單列表中。 當我第一次添加項目時,它似乎工作正常,列表更新並顯示新項目。 但是,當我添加第二個項目時,包含該列表的對話框將消失,即使從JavaScript控制台調用其show()方法也無法顯示。 通過調試,我發現在添加第二個項目時,我的列表已成為String的ArrayList,而不是聲明和定義的Item的ArrayList。 它包含我的轉換器的getAsString()方法返回的String,用於我添加到列表中的第一個項目。 當然,添加第二個項失敗,因為我正在嘗試將一個Item添加到字符串列表中。
這怎么可能? 我以為Java永遠不會允許List of Item替換為String of List。 甚至可以使用orderlist而不用它自己的字符串列表覆蓋源列表? 轉換器的工作不是首先將這些字符串轉換回對象嗎? 是否可以從項目列表構建服務器端的訂單列表,然后使用綁定屬性和值屬性映射到另一個字符串列表? 如果可能,我將如何在服務器端構建訂單列表?
編輯:修復了在getAsObject()中雙重調用i.next()的問題,但仍然得到一個字符串列表。 此外,嘗試使用context.getApplication().evaluateExpressionGet(context, "#{itemConverter}", itemConverter.class);
手動實例化轉換器context.getApplication().evaluateExpressionGet(context, "#{itemConverter}", itemConverter.class);
返回null。
我的問題的原因是錯誤的導入。 我導入了javax.annotations.ManagedBean,而不是導入javax.faces.bean.ManagedBean。 因此,如果有人通過Google搜索解決問題的方式結束此頁面,請先檢查您的導入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.