Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java h:SelectOne菜单:验证错误_Java_Jsf 2 - Fatal编程技术网

Java h:SelectOne菜单:验证错误

Java 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()值

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

但现在我有以下错误:

java.lang.ClassCastException:无法将java.lang.String转换为 ch.ethz.id.wai.bootrobot.bo.Bootenvironment


当所选项目值未通过对任何可用项目值的
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;
}