Java 如何在SelectManyList框中将集合元素显示为项目?

Java 如何在SelectManyList框中将集合元素显示为项目?,java,jsf,converter,Java,Jsf,Converter,我有一颗豆子: public ProjectServiceImpl { public List<Project> getAllProjects () { ... } } publicprojectserviceinmpl{ 公共列表getAllProjects(){…} } 我想将所有这些项目列为中的项目。当用户选择一个或多个项目并按下提交按钮时,所选项目应转换为项目 我对如何列出项目以及相应的转换器应该是什么样子有些困惑?要在中列出项目,需要使用并将值指向Sele

我有一颗豆子:

public ProjectServiceImpl {    
   public List<Project> getAllProjects () { ... }
}
publicprojectserviceinmpl{
公共列表getAllProjects(){…}
}
我想将所有这些项目列为
中的项目。当用户选择一个或多个项目并按下提交按钮时,所选项目应转换为项目

我对如何列出项目以及相应的转换器应该是什么样子有些困惑?

要在
中列出项目,需要使用
并将值指向
SelectItem
对象的列表

我通常的做法是循环浏览项目,并将每个项目转换为
SelectItem
。同时,我还使用
SelectItem
值作为键将项目存储在
HashMap
中。然后,当需要获取项目对象列表时,可以循环选择的值并从地图中获取对象

如果不想创建
哈希映射
,您可以将
项目
在列表中的位置用作
SelectItem
值,并以这种方式查找项目。

您需要实现,以便所需的Java对象以唯一的字符串表示形式表示,可以用作HTTP请求参数。在这里使用数据库技术ID(主键)非常有用

public String getAsString(FacesContext context, UIComponent component, Object value) {
    // Convert the Project object to its unique String representation.
    return String.valueOf(((Project) value).getId());
}
然后需要实现HTTP请求参数(根据定义
String
)可以转换回所需的Java对象(
Project

最后,只需将此转换器与所讨论的对象类型相关联,当
Project
出现在图片中时,JSF将负责转换,无需指定
converterId
f:converter

<converter>
    <converter-for-class>com.example.Project</converter-for-class>
    <converter-class>com.example.ProjectConverter</converter-class>
</converter>

com.example.Project
com.example.ProjectConverter
这样,您就可以创建
SelectItem
,并将
Project
作为值


你可以从这篇博客文章中获得一些背景信息和更多想法:

他的问题更多的是如何使用非标准对象,如
Project
作为选择项,而不是如何创建选择项。我只是想给出一个替代方案。
<converter>
    <converter-for-class>com.example.Project</converter-for-class>
    <converter-class>com.example.ProjectConverter</converter-class>
</converter>