JSF Primefaces:如何使用枚举中的特定序号设置 <f:selectItems> 的默认值?

JSF Primefaces: How to set default value of <f:selectItems> using specific ordinal in enum?

在我的 pom.xml:

中使用 Java 1.8、lombok 和以下版本的 JSF Primefaces
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>7.0</version>
</dependency>

<dependency>
    <groupId>org.primefaces.extensions</groupId>
    <artifactId>primefaces-extensions</artifactId>
    <version>7.0.3</version>
</dependency>

这是我在下拉列表中使用的 SportsType 枚举:

public enum SportsType {
   
    /**
     * Ordinal: 0 
     */
    BASKETBALL,
   
    /**
     * Ordinal: 1
     */
    BASEBALL,

    /**
     * Ordinal: 2
     */
    FOOTBALL

    public static SportsType getByNumber(int number) {
        if (number < 0 || number >= values().length) {
            return FOOTBALL;
        }
        return values()[number];
    }

}

这是我的 bean/view:

@Named
@ViewScoped
@Data
public class SportsView implements Serializable {

    private SportType sportType;
        
    public SportType[] getSportTypes() {
        return SportType.values();
    }

}

sports.xhtml(对应的JSF文件):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
>
<head>
    <title>Create new Team Form</title>
    <style type="text/css">
    </style>
</head>

<ui:composition>
<ui:define name="content">
    <h:form id="createNewSportTeamForm">

      <h:outputText value="Pick Sports Type"/>
            <p:selectOneMenu
                    value="#{sportsView.sportTypes[2]}">
                <f:selectItems
                   value="#{sportsView.sportTypes}"
                   var="sportType"
                   itemValue="#{sportType}"
                   itemLabel="#{sportType.getByNumber(sportType.ordinal())}"/>
            </p:selectOneMenu>

    <!-- 
       Submit button and other UI elements intentionally omitted for brevity
    -->
    </h:form>
</ui:define>
</ui:composition>
</html>

我想做的是在下拉列表中将其默认设置为 FOOTBALL,但是当我单击“提交”时,它显示为空?它确实默认为 FOOTBALL,但在我提交表单时没有设置它。

当我提交表格时(没有选择任何其他运动类型)需要它设置为 2 的序号(对于 FOOTBALL)...

非常感谢任何帮助!

Bean

中设置默认值
@Named
@ViewScoped
@Data
public class SportsView implements Serializable {

    private SportType sportType = SportsType.FOOTBALL;
    
    public SportType[] getSportTypes() {
        return SportType.values();
    }
}

sports.xhtml中,将<p:selectOneMenu value=""修改为

<h:outputText value="Pick Sports Type"/>
        <p:selectOneMenu
                value="#{sportsView.sportType}">

#{sportsView.sportTypes[2]} 将正确呈现为 SportsType.FOOTBALL,但请记住,您没有将 sportType 指定为您在 [=17= 中选择的值的容器], 当您提交表单时,sportType 仍然是 null.

也不要混淆 #{sportsView.sportType} 和 var="sportType"

var 只是一个临时变量,用于遍历 #{sportsView.sportTypes} 数组,您可以将其替换为:

            <f:selectItems
               value="#{sportsView.sportTypes}"
               var="temp"
               itemValue="#{temp}"
               itemLabel="#{temp.getByNumber(temp.ordinal())}"/>