0

我有一个名为 MyController 的会话范围托管 bean。它引用了一个名为 MyModel 的 POJO。MyModel 包含我绑定到 ap:orderlist 的一些其他 POJO 的 ArrayList,如下所示:

                <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 中构建了一个接口和方法来动态地将项目添加到 orderlist。当我第一次添加一个项目时,它似乎工作正常,列表已更新并显示新项目。但是,当我添加第二个项目时,包含列表的对话框会消失,即使从 JavaScript 控制台调用其 show() 方法也无法显示。通过调试,我发现在添加第二项时,我的列表已成为 String 的 ArrayList 而不是声明和定义的 Item 的 ArrayList。它包含将由我的转换器的 getAsString() 方法为我添加到列表中的第一项返回的字符串。自然,添加第二个项目失败,因为我试图将一个项目添加到字符串列表。

这怎么可能?我认为 Java 永远不会允许 List of Item 被 List of String 替换。甚至可以使用 orderlist 而不用它自己的字符串列表覆盖源列表吗?转换器的工作不是首先将这些字符串转换回对象吗?是否可以从项目列表在服务器端构造 orderlist,然后使用绑定属性和值属性映射到另一个字符串列表?如果可能的话,我将如何在服务器端构建订单列表?

编辑:修复了在 getAsObject() 中双重调用 i.next() 的问题,但仍获得字符串列表。此外,尝试手动实例化转换器并context.getApplication().evaluateExpressionGet(context, "#{itemConverter}", itemConverter.class);返回 null。

4

1 回答 1

2

我的问题的原因是错误的导入。我导入了 javax.annotations.ManagedBean 而不是导入 javax.faces.bean.ManagedBean。因此,如果有人通过谷歌搜索他们的问题的解决方案最终进入此页面,请先检查您的导入。

于 2012-07-05T11:56:05.280 回答