2010-09-14 63 views
2

我试图填充<h:selectOneMenu>的列表。但是,我试图检索的列表是另一个基类中变量的类的一部分。JSF从子类中选择项目

这是我的,我不知道这是甚至可能或如何做到这一点。

我有一个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> 

但是,这似乎并没有调用方法在Status类中。当页面加载完成时,选择框为空,并且控制台没有从getAll()方法输出I was called!

我对JSF有点新,我试过尽我所能寻找最好的,但我不确定在搜索时使用的术语,因为它在技术上不称为“子类”,但这是我可以提出的最好的名字,所以不用说,我没有找到任何东西。

其他信息

如果有帮助:

  • 我用Glassfish的作为我的应用程序服务器
  • 我使用Hibernate我ORM
  • 我使用JSF 2.0

回答

2

显然#{citation.status} ret请致电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()); 
    } 

} 
+0

现在我想到了,这是有道理的,因为'status'尚未初始化。对于''value属性,我可以使用'status.all'而不是'citation.status.all'吗? – Jared 2010-09-14 18:12:42

+0

如果在范围的某个地方有'#{status}',那肯定是。你还必须修复潜在的转换问题:) – BalusC 2010-09-14 18:14:40

+0

至少可以获取列表中的项目。至于转换问题,有没有办法将值设置为实际的对象?我尝试使用'',但得到错误'错误设置值状态为空转换器'我假设我需要查看使用转换器来处理? – Jared 2010-09-14 18:18:51

0

你需要一个公共的getter在引文状态。