Я не уверен, почему вы получили метку элемента вместо значения элемента внутри getAsObject()
. Возможно, ваш getAsString()
делает это неправильно и возвращает имя студента на основе идентификатора студента.
В любом случае, я могу сказать, что ваш 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. Однако вы указываете идентификатор студента в качестве значения элемента вместо целого объекта студента. Вы должны указать весь объект студента вместо этого. Вы также должны убедиться, что #{studBean.selectedStudent}
ссылается на свойство Student
, а не на какое-либо свойство Long
, представляющее идентификатор студента.
Когда вы исправите 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
свойство, представляющее идентификатор студента.