2013-07-19 43 views
5

这里是我的selectOneMenu用于selectOneMenu用于JSF与转换器

<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有问题吗?我遵循一个例子,我无法找出错误。

BTW:我在bean

public void onSelect() { 
    System.out.println(this.myObject); 
    if(this.myObject != null) { 
     System.out.println(this.myObject.getName()); 
    } 
} 

简单的方法,我已经有这样的问题,我改变了我的选择值从对象ID。但在这里我想让它与对象一起工作,因为我知道这是可能的。

谢谢

+0

请添加''或''和包括其ID'的'为好。机会很大,你会最终得到所需的转换错误面信息。或者,只需在服务器日志中查看排队但未显示的脸部消息即可。或者甚至可能有一个具体的例外,它应该已经是整个答案,比如'NullPointerException',它表示一个相当平凡的Java逻辑问题。 – BalusC

+0

我可以补充说,当我在列表中选择“无”项时,它会进入侦听器方法。 –

+0

是的,你是对的,我有一个验证错误(值不正确)。这意味着它是我的转换器?我认为它是一个非常简单的转换器。 –

回答

7

我有解决方案。我不得不重写MyObject类中的“equals”方法!

谢谢。

编辑:代码

@Override 
public boolean equals(Object obj) { 
    if(this.id == ((MyObject) obj).id) { 
     return true; 
    }else { 
     return false; 
    } 
} 
相关问题