JSF从子类中选择项目

时间:2010-09-14 17:58:29

标签: java jsf jsf-2

我正在尝试填充<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

2 个答案:

答案 0 :(得分:2)

显然#{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());
    }

}

答案 1 :(得分:0)

你需要一个公共的getter来获取Citation中的状态。