gpt4 book ai didi

java - :selectOneMenu : validation error

转载 作者:行者123 更新时间:2023-12-02 07:29:17 25 4
gpt4 key购买 nike

我在页面中定义了以下下拉框: ...

<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));
}
...

在 Controller 中我设置了 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);
}

问题是,当我单击页面中的按钮(绑定(bind)到操作)时,我收到错误:

detailForm:bootenvironment1: Validation error: value is not valid.

我不明白错误在哪里; selectItems 是一个映射,其中对象的名称字段(因此是字符串)作为键,对象本身作为值。那么默认选择的值 (value="#{detailModel.selectedBootenvironment1}") 也是一个字符串,正如您在模型的 getter/setter 方法中看到的那样.

另一个问题(可能与前一个问题相关)是,当页面首次加载时,默认选择的值应该是 --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 cannot be cast to ch.ethz.id.wai.bootrobot.bo.Bootenvironment

最佳答案

当所选项目值未通过任何可用项目值的 equals() 测试时,您将收到此错误。

事实上,您有一个 Bootenvironment 项值的列表,但您已将该属性绑定(bind)到 String,这表明您依赖于Bootenvironment#toString() 值作为提交的值传递,并且您根本没有使用普通的 JSF Converter。在使用 Bootenvironment 对象进行 equals() 测试时,String 永远无法返回 true

您需要提供一个转换器,用于在Bootenvironment 及其唯一的String 表示形式之间进行转换。通常,技术 ID(例如从数据库自动生成的 PK)被用作唯一的 String 表示形式。

@FacesConverter(forClass=Bootenvironment.class)
public class BootenvironmentConverter implements Converter {

@Override
public void getAsString(FacesContext context, UIComponent component, Object modelValue) throws ConverterException {
// Write code to convert Bootenvironment to its unique String representation. E.g.
return String.valueOf(((Bootenvironment) modelValue).getId());
}

@Override
public void getAsObject(FacesContext context, UIComponent component, Object submittedValue) throws ConverterException {
// Write code to convert unique String representation of Bootenvironment to concrete Bootenvironment. E.g.
return someBootenvironmentService.find(Long.valueOf(submittedValue));
}

}

最后,在相应地实现转换器之后,您应该能够将 selectedBootenvironment1 属性修复为普通属性,而不会在 getter/setter 中出现任何困惑:

private Bootenvironment selectedBootenvironment1;

public Bootenvironment getSelectedBootenvironment1() {
return selectedBootenvironment1;
}

public void setSelectedBootenvironment1(Bootenvironment selectedBootenvironment1) {
this.selectedBootenvironment1 = selectedBootenvironment1;
}

关于java - :selectOneMenu : validation error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13141501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com