我在页面中定义了以下下拉框:...
<td>
<h:selectOneMenu id="bootenvironment1" value="#{detailModel.selectedBootenvironment1}"
disabled="#{detailModel.mode == detailModel.viewMode}">
<f:selectItems value="#{detailModel.availableBootenvironments}"/>
</h:selectOneMenu>
</td>
在我的模型中,我有:
...
private Map<String, Bootenvironment> availableBootenvironments;
public DefinitionDetailModel()
{
super();
}
public String getSelectedBootenvironment1()
{
if (((Definition) getAfterObject()).getBootenvironment1() != null)
{
return ((Definition) getAfterObject()).getBootenvironment1().getEnvironmentName();
}
return "--Please select one--";
}
public void setSelectedBootenvironment1( String selectedBootenvironment )
{
((Definition) getAfterObject()).setBootenvironment1(availableBootenvironments.get(selectedBootenvironment));
}
...
在控制器中,我设置了 availableBootenvironments 映射:
private void fetchBootenvironments()
{
...
@SuppressWarnings( "unchecked" )
List<Bootenvironment> bootenvironments = (List<Bootenvironment>) ...
Map<String, Bootenvironment> availableBootenvironments = new HashMap<String, Bootenvironment>();
availableBootenvironments.put("--Please select one--", null);
for(Bootenvironment bootenvironment : bootenvironments)
{
availableBootenvironments.put(bootenvironment.getEnvironmentName(), bootenvironment);
}
((DefinitionDetailModel) detailModel).setAvailableBootenvironments(availableBootenvironments);
}
问题是,当我单击页面中的按钮(绑定到操作)时,出现错误:
detailForm:bootenvironment1: 验证错误:值无效。
我不明白错误在哪里;selectItems的值是一个映射,其中对象的名称字段(即字符串)作为键,对象本身作为值。然后,默认选择 ( ) 的值也是一个字符串,正如您在模型的 getter/setter 方法中看到的那样。value="#{detailModel.selectedBootenvironment1}"
另一个问题(可能与前一个有关)是,当页面第一次加载时,默认选择的值应该是 --Please select one--- 因为getBootenvironment1()返回null,但这不会发生:另一个来自列表被选中。
你能帮我理解我做错了什么/哪里做错了吗?
编辑
正如你所说,我实现了转换器:
@FacesConverter( forClass = Bootenvironment.class )
public class BootenvironmentConverter implements Converter
{
@Override
public String getAsString( FacesContext context, UIComponent component, Object modelValue ) throws ConverterException
{
return String.valueOf(((Bootenvironment) modelValue).getDbId());
}
@Override
public Object getAsObject( FacesContext context, UIComponent component, String submittedValue ) throws ConverterException
{
List<Bootenvironment> bootenvironments = ... (get from DB where dbid=submittedValue)
return bootenvironments.get(0);
}
}
但现在我有以下错误:
java.lang.ClassCastException:java.lang.String 无法转换为 ch.ethz.id.wai.bootrobot.bo.Bootenvironment