我正在尝试填充 <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 作为我的应用服务器
- 我正在为我的 ORM 使用 Hibernate
- 我正在使用 JSF 2.0
最佳答案
显然 #{citation.status}
返回了 null
。
也就是说,这是行不通的。 h:selectOneMenu 值
必须匹配与 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());
}
}
关于java - JSF 从子类中选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3711572/