微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

<p:selectOneMenu> 的 PrimeFaces <p:importEnum>

如何解决<p:selectOneMenu> 的 PrimeFaces <p:importEnum>

所以我正在创建一个 web 应用程序,它应该显示一个下拉框,其中包含枚举中的所有值。我发现 this question 确实提供了我需要的所有信息。遗憾的是,我不能使用这样的代码,因为它会引发错误

一、枚举:

public enum Status {
    YES("Yes"),NO("No"),OPT_IN("Opt in");
    
    private String label;

    Status(String label) {
        this.setLabel(label);

    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

}

现在是 xhtml 页面

<p:importEnum type="package.name.Status"/>
<p:outputLabel for="statusDropdown" value="Status:" />
<p:selectOneMenu id="statusDropdown" 
    value="#{model.status}" >
    <f:selectItems value="#{Status}" var="statusEnum" 
        itemValue="#{statusEnum}" itemLabel="#{statusEnum.label}"/>
</p:selectOneMenu>

根据我链接的问题,应显示包含枚举值label 字符串的下拉列表。然而,事实并非如此。

使用 itemLabel 时,我收到一条错误消息,指出“标签”不是有效的枚举值。 缩写的堆栈跟踪:

java.lang.NumberFormatException: For input string: "label"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at javax.el.ArrayELResolver.coerce(ArrayELResolver.java:144)
    at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:61)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:190)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.UIComponentBase$AttributesMap.get(UIComponentBase.java:2427)
    at org.primefaces.renderkit.SelectRenderer.createSelectItem(SelectRenderer.java:161)
    at org.primefaces.renderkit.SelectRenderer.getSelectItems(SelectRenderer.java:114)

删除“itemLabel”时,我收到另一个错误

javax.faces.convert.ConverterException: Status: '[Lpackage.name.Status;@42b3ca25' must be convertible to an enum.
    at javax.faces.convert.EnumConverter.getAsstring(EnumConverter.java:219)
    at org.primefaces.renderkit.SelectRenderer.getoptionAsstring(SelectRenderer.java:203)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:591)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeselectItems(SelectOneMenuRenderer.java:554)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeHiddenSelect(SelectOneMenuRenderer.java:241)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:207)

我调试了这个错误,发现除了 3 个枚举值之外,它还尝试添加第 4 个值。第 4 个值是“ALL_VALUES”数组。

在上一次测试中,我刚刚将 <p:selectOneMenu> 更改为 <h:selectOneMenu>,现在它确实可以工作了。它仍然添加一个 ALL_VALUES 选择选项,但它不应该这样做。

任何帮助都可以得到一个只包含枚举值的下拉列表,最好还有正确的标签

谢谢

解决方法

从 Primefaces importEnum 组件导入的枚举列表由 ImportEnumTagHandler 类管理。
正如您在 getEnumValues 函数中看到的,它迭代枚举常量 每种类型,然后在地图中添加另一个值,以及每种类型的列表,使用 xhtml 中指定的后缀(默认值为 ALL_VALUES)。
因此,如果您只有一个枚举并且没有指定任何后缀,则可以像这样为 selectItems 使用枚举:

<p:importEnum type="package.Status" />
<p:outputLabel for="statusDropdown" value="Status:" />
<p:selectOneMenu id="statusDropdown" value="#{bean}">
    <f:selectItems value="#{Status.ALL_VALUES}"
        itemLabel="#{element.label}" itemValue="#{element}" var="element" />
</p:selectOneMenu>

Import enum docs

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。