2

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

我的 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 并返回等:

@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() 方法的事情,(这并不能与其他所有工作相加,但我还是覆盖了它,如下所示,其中哈希码只是 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方法中放入一些debug语句显示,由于与空对象的比较,在构建列表过程中的所有比较都失败了,但是查看seam调试页面,它表明该值肯定是设置的。

4

1 回答 1

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它可以解决你的问题。

于 2012-11-02T15:32:42.757 回答