我正在尝试填充<h:selectOneMenu>
的列表。但是,我尝试检索的列表是另一个类的一部分,该另一个类是基类中的变量。
这是我所拥有的,我不确定这是否可能或如何实现。
我有一个Citation
类,内容如下:
public class Citation {
private int id;
private String title;
private Status status;
// getters and setters
}
然后我有一个
Status
类,内容如下:public class Status {
private int id;
private String name;
public List<Status> getAll() {
// goes to the database and gets a list of status objects
System.out.println("I was called!");
}
// getters and setters
}
然后在我的xhtml页面上,我有以下内容:
<h:selectOneMenu id="citation_status" value="#{citation.status}">
<f:selectItems value="#{citation.status.all}" var="s"
itemLabel="#{s.name}" itemValue="#{s.id}" />
</h:selectOneMenu>
但是,这似乎根本没有调用
getAll
类中的Status
方法。页面加载完成后,选择框为空,并且控制台没有I was called!
方法的getAll()
输出。我对JSF有点陌生,我已经尝试过尽我所能,但是我不确定在搜索时要使用的术语,因为它在技术上没有被称为“子类”,但这是最好的名称我可以提出,因此不用说,我从搜索中什么都没有提出。
附加信息
如果有帮助:
我正在使用Glassfish作为我的应用程序服务器
我正在将Hibernate用于我的ORM
我正在使用JSF 2.0
最佳答案
显然#{citation.status}
返回了null
。
也就是说,这行不通。 h:selectOneMenu value
必须与与f:selectItem itemValue
相同的类型匹配,本例中为int
。您将获得转换器异常。
如何最好地解决这个问题取决于功能要求,这个问题尚不清楚。也许您需要f:selectItem itemValue="#{s}"
,或者您需要h:selectOneMenu value="#{citation.id}"
。
更新:关于转换器,这是一个启动示例:
@FacesConverter(forClass=Status.class)
public class URLConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
return someStatusDAO.findById(Long.valueOf(value));
} catch (SomeException e) {
throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to Status", value)), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return String.valueOf(((Status) value).getId());
}
}