当支持 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调试页面,它表明该值肯定是设置的。