Java h:SelectOne菜单:验证错误
我在页面中定义了以下下拉框: 但现在我有以下错误: java.lang.ClassCastException:无法将java.lang.String转换为 ch.ethz.id.wai.bootrobot.bo.BootenvironmentJava h:SelectOne菜单:验证错误,java,jsf-2,Java,Jsf 2,我在页面中定义了以下下拉框: 但现在我有以下错误: java.lang.ClassCastException:无法将java.lang.String转换为 ch.ethz.id.wai.bootrobot.bo.Bootenvironment 当所选项目值未通过对任何可用项目值的equals()测试时,将出现此错误 实际上,这里有一个Bootenvironment项值的列表,但是您将属性绑定到一个String,这表明您依赖于作为提交值传递的Bootenvironment#toString()值
当所选项目值未通过对任何可用项目值的
equals()
测试时,将出现此错误
实际上,这里有一个Bootenvironment
项值的列表,但是您将属性绑定到一个String
,这表明您依赖于作为提交值传递的Bootenvironment#toString()
值,并且根本不使用普通的JSF转换器。使用Bootenvironment
对象测试equals()
时,字符串
永远不能返回true
您需要提供一个转换器
,它可以在Bootenvironment
及其唯一的字符串
表示之间进行转换。通常,技术ID(例如从数据库自动生成的PK)被用作唯一的字符串表示
@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));
}
}
最后,在相应地实现转换器之后,您应该能够将selectedbootconvironment 1
属性修复为普通属性,而不会在getter/setter中造成任何混乱:
private Bootenvironment selectedBootenvironment1;
public Bootenvironment getSelectedBootenvironment1() {
return selectedBootenvironment1;
}
public void setSelectedBootenvironment1(Bootenvironment selectedBootenvironment1) {
this.selectedBootenvironment1 = selectedBootenvironment1;
}
可能您获得NPE是因为getAfterObject()
为空,并且getter:getSelectedBootenvironment1()
没有为selectOneMenu
值
属性返回有效值。在访问getBootenvironment1()
方法之前,请尝试检查getAfterObject()
[在getSelectedBootenvironment1()
]中是否为null。我检查了该方法,并且getAfterObject()不为null…因此接下来的问题是:getBootenvironment1().getEnvironmentName()
是否总是返回非null对象?(大概是String
)当我调试时,在getSelectedBootenvironment1()中,我看到它没有进入if(这意味着((定义)getAfterObject())。getBootenvironment1()返回空值)中。因此,该方法按预期返回“--请选择一个--”..@pankar:map键是选项标签,而不是选项值。因此,这永远不会传递回服务器。另见谢谢你,巴卢斯克;还有一个问题:如何在页面中定义控制器?很好。我发现了如何定义它,但现在我遇到了另一个问题:请参阅有问题的编辑。您不需要在视图中定义它。@FacesConverter(forClass=Bootenvironment.class)
注意,只要遇到Bootenvironment
作为模型值,就会自动应用它;这到底是在哪里抛出的?但是我必须在faces-config.xml中定义它吗?
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);
}
@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);
}
}
@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));
}
}
private Bootenvironment selectedBootenvironment1;
public Bootenvironment getSelectedBootenvironment1() {
return selectedBootenvironment1;
}
public void setSelectedBootenvironment1(Bootenvironment selectedBootenvironment1) {
this.selectedBootenvironment1 = selectedBootenvironment1;
}