我正在尝试填充的列表<h:selectOneMenu>。但是,我尝试检索的列表是另一个类的一部分,该另一个类是基类中的变量。
<h:selectOneMenu>
这就是我所拥有的,而且我不确定这是否可行或如何实现。
我有一个Citation以下课程:
Citation
public class Citation { private int id; private String title; private Status status; // getters and setters }
然后我有一个Status以下课程:
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()方法。
getAll
I was called!
getAll()
我对JSF有点陌生,我已经尝试过尽我所能,但是我不太确定搜索时要使用的术语,因为它在技术上没有被称为“子类”,但这是最好的名称我可以想出,所以不用说,我从搜索中什么都没想到。
附加信息
如果有帮助:
显然#{citation.status}回来了null。
#{citation.status}
null
就是说,这行不通。在h:selectOneMenu value必须在相同的类型相匹配f:selectItem itemValue,其在这种情况下的int。您将获得转换器异常。
h:selectOneMenu value
f:selectItem itemValue
int
如何最好地解决这个问题取决于功能要求,这个问题尚不清楚。也许您需要f:selectItem itemValue="#{s}",或者您需要h:selectOneMenu value="#{citation.id}"。
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()); } }