我有一个名为MyController的会话作用域托管bean。它引用了一个名为MyModel的POJO。 MyModel包含一些其他POJO的ArrayList,我将它绑定到p: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,用于我添加到列表中的第一个项目。当然,添加第二个项目失败,因为我正在尝试将一个项目添加到字符串列表。
这怎么可能?我以为Java永远不会允许List of Item替换为String of List。甚至可以使用orderlist而不用它自己的字符串列表覆盖源列表?转换器的工作不是首先将这些字符串转换回对象吗?是否可以从项目列表构建服务器端的订单列表,然后使用绑定属性和值属性映射到另一个字符串列表?如果可能,我将如何在服务器端构建订单列表?
编辑:修复了在getAsObject()中对i.next()进行双重调用的问题,但仍然获得了字符串列表。此外,尝试使用context.getApplication().evaluateExpressionGet(context, "#{itemConverter}", itemConverter.class);
手动实例化转换器将返回null。
答案 0 :(得分:2)
我的问题的原因是错误的导入。我导入了javax.annotations.ManagedBean,而不是导入javax.faces.bean.ManagedBean。因此,如果某人通过谷歌搜索解决他们的问题而在此页面上结束,请先检查您的导入。