使用转换器在对象上选择JSF的selectOneMenu

5

这是我的 SelectOneMenu

<h:selectOneMenu value="#{bean.myObject}" >
    <f:ajax render="componentToRender" listener="#{bean.onSelect}"/>
    <f:converter converterId="myObjectConverter" />
    <f:selectItem itemLabel="None" itemValue="#{null}" />
    <f:selectItems value="#{bean.objects}" var="object" itemValue="#{object}" itemLabel="#{object.name}" />
</h:selectOneMenu>

我的转换器
@FacesConverter("myObjectConverter")
public class MyObjectConverter implements Converter{

    private List<MyObject> objects;

    public MyObjectConverter(){
        this.objects = MyController.getAllMyObjects();
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if(!StringUtils.isInteger(value)) {
            return null;
        }
        return this.getMyObject(value);
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value == null) {
            return null;
        }
        return String.valueOf(((MyObject) value).getId()).toString();
    }

    public MyObject getMyObject(String id) {
        Iterator<MyObject > iterator = this.objects.iterator();
        while(iterator.hasNext()) {
            MyObject object = iterator.next();

            if(object.getId() == Integer.valueOf(id).intValue()) {
                return object;
            }
        }
        return null;
    }

}

问题在于我的ajax监听器从未被调用,我的组件也从未渲染出来。 我的转换器或selectOneMenu有问题吗?我按照一个例子去做,但是无法找到错误。 顺便说一下:我的bean中有一个简单的方法。
public void onSelect() {
    System.out.println(this.myObject);
    if(this.myObject != null) {
        System.out.println(this.myObject.getName());
    }
}

我之前也遇到过这样的问题,我将我的选定值从对象更改为ID。但是在这里,我希望能使用对象来解决问题,因为我知道这是可能的。

谢谢。


请添加 <h:message><h:messages> 并在 <f:ajax render> 中包含其 ID。这样做的话,你很有可能最终会得到所需的转换错误面对信息。或者,只需查看服务器日志以获取已排队但未显示的 faces 信息。或者也许在其中甚至有一个具体的异常,它应该已经是整个答案了,比如 NullPointerException,它表示一个相当琐碎的 Java 逻辑问题。 - BalusC
我可以补充一下,当我在列表中选择“无”项目时,它会进入监听器方法。 - Loric
是的,你说得对,我有一个验证错误(值不正确)。这意味着是我的转换器出了问题吗?我原以为它是非常简单的转换器。 - Loric
这个问题重复了Validation Error: Value is not valid - BalusC
1个回答

8
我有解决方案。我需要在MyObject类中覆盖“equals”方法!感谢您的帮助。
编辑:代码
@Override
public boolean equals(Object obj) {
    if(this.id == ((MyObject) obj).id) {
        return true;
    }else {
        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接