<p:selectOneMenu> 的 PrimeFaces <p:importEnum>
PrimeFaces <p:importEnum> for <p:selectOneMenu>
所以我正在创建一个 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
时,我收到一条错误消息,指出 'label' 不是有效的枚举值。
缩写堆栈跟踪:
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
class.
管理
正如您在 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>
所以我正在创建一个 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
时,我收到一条错误消息,指出 'label' 不是有效的枚举值。
缩写堆栈跟踪:
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
class.
管理
正如您在 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>