- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在<h:selectManyCheckbox>
中使用枚举值。复选框已正确填充,但是,在选择一些值并提交它们时,其运行时类型为String
,而不是枚举。我的代码:
<h:selectManyCheckbox value="#{userController.roles}" layout="pageDirection">
<f:selectItems value="#{userController.rolesSelectMany}" />
</h:selectManyCheckbox>
public SelectItem[] getRolesSelectMany() {
SelectItem[] items = new SelectItem[SecurityRole.values().length];
int i = 0;
for (SecurityRole role : SecurityRole.values()) {
items[i++] = new SelectItem(role, role.toString());
}
return items;
}
public List<SecurityRole> getRoles() {
getCurrent().getRoles();
}
public void setRoles(List<SecurityRole> roles) {
getCurrent().setRoles(roles);
}
最佳答案
此问题与枚举无关。对于JSF内置了转换器的其他List
类型,您也会遇到同样的问题。 List<Integer>
,List<Double>
等。
问题是EL在运行时运行,并且泛型类型信息在运行时丢失。因此,从本质上讲,JSF / EL对List
的参数化类型一无所知,并且默认为String
,除非由显式Converter
另行指定。从理论上讲,在 ParameterizedType#getActualTypeArguments()
的帮助下使用讨厌的反射黑客是可能的,但是JSF / EL开发人员可能有这样做的理由。
您确实需要为此明确定义一个转换器。由于JSF已经附带了内置的 EnumConverter
(在这种特殊情况下不能单独使用,因为您必须在运行时指定枚举类型),因此可以如下扩展它:
package com.example;
import javax.faces.convert.EnumConverter;
import javax.faces.convert.FacesConverter;
@FacesConverter(value="securityRoleConverter")
public class SecurityRoleConverter extends EnumConverter {
public SecurityRoleConverter() {
super(SecurityRole.class);
}
}
<h:selectManyCheckbox value="#{userController.roles}" converter="securityRoleConverter">
<f:selectItems value="#{userController.rolesSelectMany}" />
</h:selectManyCheckbox>
<h:selectManyCheckbox value="#{userController.roles}">
<f:converter converterId="securityRoleConverter" />
<f:selectItems value="#{userController.rolesSelectMany}" />
</h:selectManyCheckbox>
package com.example;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
@FacesConverter(value="genericEnumConverter")
public class GenericEnumConverter implements Converter {
private static final String ATTRIBUTE_ENUM_TYPE = "GenericEnumConverter.enumType";
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Enum) {
component.getAttributes().put(ATTRIBUTE_ENUM_TYPE, value.getClass());
return ((Enum<?>) value).name();
} else {
throw new ConverterException(new FacesMessage("Value is not an enum: " + value.getClass()));
}
}
@Override
@SuppressWarnings({"rawtypes", "unchecked"})
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Class<Enum> enumType = (Class<Enum>) component.getAttributes().get(ATTRIBUTE_ENUM_TYPE);
try {
return Enum.valueOf(enumType, value);
} catch (IllegalArgumentException e) {
throw new ConverterException(new FacesMessage("Value is not an enum of type: " + enumType));
}
}
}
List<Enum>
可以在各种
genericEnumConverter
上使用。对于
List<Double>
,
List<Integer>
等,应该使用内置的转换器
javax.faces.Double
,
javax.faces.Integer
等。由于无法从 View 侧指定目标枚举类型(
Class<Enum>
),因此内置的Enum转换器不合适。 JSF实用程序库
OmniFaces正是提供了此转换器
out the box。
Enum
属性,内置的
EnumConverter
已经足够了。 JSF将使用正确的目标枚举类型自动实例化它。
关于jsf - 在h:selectManyCheckbox中使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3822058/
我有 selectManyCheckbox,但在更改事件后我无法从中获取选中的值(所选值的列表保持为空)。更改事件已触发,但在 Debug模式下,listSelectedSignalCauses 中没
如何在ice:selectManyCheckbox中以垂直模式显示选项? 我需要在垂直模式下显示菜单选项列表。这时候我就显示水平了。 最佳答案
我遇到了一个非常有趣的问题。这是我的场景: 我的目标 使用带有嵌套工具提示的 SelectManyCheckbox。 使用 SelectManyCheckbox onHide 事件触发 Ajax (A
如何预选 h:selectManyCheckbox 中的元素成分?我已经搜索了 f:selectItem 的属性标记但尚未找到如何预先选择此项目(即在调用站点时已勾选)。 最佳答案 value h:s
任务:有一个面板,带有 selectMany 复选框,有 5 列。选择框的值按升序排列,但它们在列中从左到右出现,而不是从上到下。 使用:Primefaces 代码: 当前屏幕: [] a
如果 h:selectManyCheckbox 具有属性 readonly="true",则用户无法选中或取消选中该复选框。但是可以点击它,为什么? 最佳答案 与其他 HTML 一样 input元素,
我需要以 4 列显示 selectManyCheckbox 列表,但问题是该组件生成一个表格,所以我不知道如何定义列。 我正在使用 PF 3.4,无法升级到 PF 4.x。大家有什么解决办法吗? 已编
如果您使用由 hibernate 代理的集合支持的 selectManyCheckbox,您将遇到可怕的 LazyInitializationException 问题。这与支持 bean 的状态无关!
好吧,我不知道为什么它说我的目标不是集合或数组,因为我试图将 selectManyCheckbox 的结果放入整数数组中。它只是一个 1-50 的复选框,用户可以在其中选择要存储在数组中并稍后显示的多
在我看来,我使用 StudentModelBean 来存储表单中输入的数据。考虑一下我表单的这一部分: 我的要求是我需要将每个选定的项目值存储到每个 Languages 对象
我有一个循环问题和答案。我想填充 map Map> 检查答案值
如何以编程方式设置对 af:selectManyCheckbox 项的选择? 我有一个旧的 ADF 版本,我尝试在此列表中创建一个项目,如果我单击它,它会选择所有剩余的项目: 我的java类
我在 JSF selectManyCheckbox 和 A4J 支持方面遇到了问题。目的是在选中复选框时运行某些操作。这在 Firefox 中完美运行。然而,在任何 IE (ie6/ie7/ie8)
这个问题在这里已经有了答案: Validation Error: Value is not valid (3 个答案) 关闭 7 年前。 我是 JSF 的新手,我收到以下关于 的错误: Valid
我想从复选框中恢复选中的项目列表,当我迭代列表以检索项目时,问题是检查指令 while 循环到无限这是我的代码: JSF: 代码: public Class TestAjax { p
我有一个组件,如下所示,它是通过 HtmlSelectManyCheckbox 绑定(bind)的,
大家好,有没有办法在我检查其中一个时在 p:selectManyCheckbox 的 primefaces 中触发 ajax 调用?像这样的东西: 还有我的MB: public
我使用 JSF 2.0 创建了 Web 应用程序,其中有很多复选框。我想在单击“全选复选框”时选中这些复选框。 我有以下代码
我在可编辑数据表中使用 Primefaces selectManyCheckbox like this one .当用户单击编辑按钮时,他可以在文档列中的不同文档之间进行选择。那是我的代码。请注意我使
我正在尝试实现以下外观:http://www.primefaces.org/showcase/ui/selectManyCheckbox.jsf 请注意,在 PrimeFaces 展示网站上,组件周围
我是一名优秀的程序员,十分优秀!