h:selectOneMenu没有填充“选定”项目

时间:2012-10-31 04:57:25

标签: seam2 selectonemenu

我在h:selectOneMenu上遇到问题,因为在支持bean上已经设置了某些内容时,没有选择的项目。我正在使用接缝并指定了客户转换器。在我的“创建”页面上工作时,一切正常,可以选择菜单中的某些内容,并且在提交页面时,也会分配正确的值并将其保留到数据库中。
但是,当我在“编辑”页面上工作时,菜单的默认选择不是当前选择。我已经完成并确认某些内容已经确定等等。

我的selectOneMenu看起来像这样:

<h:selectOneMenu id="selVariable" 
     value="#{customer.variableLookup}" 
     converter="#{variableLookupConverter}">
    <s:selectItems var="source" 
        value="#{customerReferenceHelper.variableLookups()}" 
        label="#{source.name}" />
</h:selectOneMenu>

转换器位于下方。它非常简单,只需将id从string转换为int和back等:

@Name( "variableLookupConverter" )
public class VariableLookupConverter implements Serializable, Converter {

 @In
 private CustomerReferenceHelper customerReferenceHelper;

 @Override
 public Object getAsObject( FacesContext arg0, UIComponent arg1, String arg2 ) {
    VariableLookup variable= null;
    try {
        if ( "org.jboss.seam.ui.NoSelectionConverter.noSelectionValue".equals( arg2 ) ) {
            return null;
        }
        CustomerReferenceHelper customerReferenceHelper = ( CustomerReferenceHelper ) Contexts.getApplicationContext().get(
                "customerReferenceHelper" );
        Integer id = Integer.parseInt( arg2 );
        source = customerReferenceHelper.getVariable( id );
    } catch ( NumberFormatException e ) {
        log.error( e, e );
    }
    return variable;

 }

 @Override
 public String getAsString( FacesContext arg0, UIComponent arg1, Object arg2 ) {
    String result = null;
    VariableLookup variable= ( VariableLookup ) arg2;
    Integer id = variable.getId();
    result = String.valueOf( id );
    return result;
 }
}

我已经看到了一些关于它的东西可能是类上的equals()方法,(这并没有与其他所有工作相加,但我仍然如下所述覆盖它,其中hashcode只是id (id是每个项目的唯一标识符)。

等于方法:

@Override
public boolean equals( Object other ) {
    if ( other == null ) {
        return false;
    }
    if ( this == other ) {
        return true;
    }
    if ( !( other instanceof VariableLookup ) ) {
        return false;
    }
    VariableLookup otherVariable = ( VariableLookup ) other;
    if ( this.hashCode() == otherVariable.hashCode() ) {
        return true;
    }
    return false;
}

我的智慧结束了,我找不到我错过的东西?!任何帮助将不胜感激。

更新:根据我的理解,当列表构建时,它会检查每个项目的绑定值,以查看它们是否匹配以设置所选项目。在equals方法中放置一些调试语句表明,由于与null对象的比较,在构建列表期间的所有比较都会失败,但是检查seam debug页面,它会显示该值已明确设置。

1 个答案:

答案 0 :(得分:1)

试试这个;

<h:selectOneMenu id="selVariable" 
 value="#{customer.variableLookup}">
<s:selectItems var="source" 
    value="#{customerReferenceHelper.variableLookups()}" 
    label="#{source.name}" itemValue="#{source}/>
<s:convertEntity />
</h:selectOneMenu>

我几乎为所有实体使用这种表示法。

修改

Omnifaces有SelectItemsConverter它可以解决你的问题。