我在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页面,它会显示该值已明确设置。
答案 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它可以解决你的问题。