如何将所有枚举值显示为<f:selectItems>,并将枚举属性作为标签

use*_*951 1 datatable jsf enums selectonemenu omnifaces

我有一个RoleStatus枚举,它作为Role实体的属性映射到DB中的整数(但该部分是无关紧要的).我想提出一个List<Role><p:dataTable>其中一列应该有一个<h:selectOneMenu>RoleStatus的财产Role实体.如何使用或不使用OmniFaces实现此功能

这是枚举:

public enum RoleStatus {

    ACTIVE(1, "Active"),
    DISABLE(2, "Disable");

    private final int intStatus;
    private final String status;

    private RoleStatus(int intStatus, String status) {
        this.intStatus = intStatus;
        this.status = status;
    }

    public int getIntStatus() {
        return status;
    }

    public String getStatus() {
        return status;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是支持bean:

@ManagedBean
@ViewScoped
public class RoleController {

    private List<Role> roles;

    @ManagedProperty("#{roleService}")
    private IRoleService roleService;

    @PostConstruct
    public void init() {
        roles = roleService.getRoles();
    }

    public List<Role> getRoles() {
        return roles;
    }

}
Run Code Online (Sandbox Code Playgroud)

最后,数据表我想要实体<h:selectOneMenu>RoleStatus属性Role,显示所有可用的枚举值作为选择项目选项.

<h:form id="roleForm">
    <p:dataTable value="#{roleController.roles}" var="role">
        <p:column>
            <h:outputText value="#{role.roleid}" />
        </p:column>
        <p:column>
            <h:inputText value="#{role.role}" />
        </p:column>
        <p:column>
            <h:inputText value="#{role.description}" />
        </p:column>
        <p:column>
            <h:selectOneMenu value="#{role.roleStatus}">
                <!-- How??? -->
            </h:selectOneMenu>
        </p:column>
    </p:dataTable>
</h:form>
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我需要OmniFacesSelectItemsConverter吗?

Bal*_*usC 6

你不需要转换器.JSF已经有一个内置的枚举转换器.

如果没有OmniFaces,您可以将枚举值作为以下可用项提供<h:selectOneMenu>:

  1. 将此方法添加到RoleController:

    public RoleStatus[] getRoleStatuses() {
        return RoleStatus.values();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样,所有枚举值都可用#{roleController.roleStatuses}.

  2. 然后使用此下拉列表:

    <h:selectOneMenu value="#{role.roleStatus}">
        <f:selectItems value="#{roleController.roleStatuses}" var="roleStatus"
            itemValue="#{roleStatus}" itemLabel="#{roleStatus.status}" />
    </h:selectOneMenu>
    
    Run Code Online (Sandbox Code Playgroud)

    注意:由于这些值是静态/应用程序范围的,因此将方法移动到单独的@ApplicationScopedbean 并不会有什么坏处.


使用OmniFaces,您可以删除额外的getter并直接通过<o:importConstants>以下方式导入枚举:

  1. 将它添加到模板顶部的某处(假设它在com.example包中):

    <o:importConstants type="com.example.RoleStatus" />
    
    Run Code Online (Sandbox Code Playgroud)

    这样,枚举类本身就可以使用#{RoleStatus}(注意大小写!).

  2. 然后使用此下拉列表:

    <h:selectOneMenu value="#{role.roleStatus}">
        <f:selectItems value="#{RoleStatus.values()}" var="roleStatus"
            itemValue="#{roleStatus}" itemLabel="#{roleStatus.status}" />
    </h:selectOneMenu>
    
    Run Code Online (Sandbox Code Playgroud)