我不知道为什么你得到的是项目标签而不是里面的项目值getAsObject()
。也许你的getAsString()
做错了,它根据学生 ID 返回学生姓名。
无论如何,我可以告诉你,你的itemValue
肯定是不对的。
<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}">
<f:selectItems value="#{studBean.student}" var="s"
itemValue="#{s.studid}" itemLabel="#{s.name}" />
<f:converter converterId="studentconverter" />
</h:selectOneMenu>
转换器旨在用于在复杂的 Java 对象和 String 表示形式之间进行转换,以便它可以作为 HTTP 请求参数进行传递。但是,您将学生 ID 指定为项目值而不是整个学生对象。您需要指定整个学生对象。您还应该确保#{studBean.selectedStudent}
指的是Student
财产,而不是某些Long
代表学生 ID 的属性。
当您修复itemValue
如下:
<h:selectOneMenu id="studlist" value="#{studBean.selectedStudent}">
<f:selectItems value="#{studBean.student}" var="s"
itemValue="#{s}" itemLabel="#{s.name}" />
<f:converter converterId="studentconverter" />
</h:selectOneMenu>
和你的转换器如下(省略了简单的空检查):
public String getAsString(FacesContext context, UIComponent component, Object value) {
// This method is called when item value is to be converted to HTTP request parameter.
// Normal practice is to return an unique identifier here, such as student ID.
Student student = (Student) value;
Long id = student.getStudid();
return String.valueOf(id);
}
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// This method is called when HTTP request parameter is to be converted to item value.
// You need to convert the student ID back to Student.
Long id = Long.valueOf(value);
Student student = someStudentService.find(id);
return student;
}
那么它应该可以工作。
或者,您可以保留您的itemValue
就像你最初一样并删除<f:converter>
完全,但你必须改变#{studBean.selectedStudent}
指向一个Long
代表学生 ID 的属性。