f:selectItem
中的值是整数(Const.DB_NEW_DATASET
(,但testlistener
的输出总是java.lang.String
。这不是我所期望的。
.xhtml
<f:metadata>
<f:importConstants type="foo.bar.Const" />
</f:metadata>
<h:selectOneListbox value="#{viewScope.foo}">
<f:selectItem
itemValue="#{Const.DB_NEW_DATASET}"
itemLabel="foo" />
<f:selectItem
itemValue="#{Const.DB_NEW_DATASET}"
itemLabel="bar" />
<f:ajax listener="#{myBean.testlistener}" />
</h:selectOneListbox>
豆
@Named
@ViewScoped
public class MyBean implements Serializable {
@Inject
@ViewMap
private Map<String, Object> viewMap;
public void testlistener() {
System.out.println(viewMap.get('foo').getClass());
}
}
public class Const {
public static final Integer DB_NEW_DATASET = -1;
}
莫哈拉 2.3.9.SP01
它实际上根本不是"投射到java.lang.String
"。它只是默认的ServletRequest#getParameter()
类型,然后由 JSF 保留未转换。
这是因为#{viewScope.foo}
ValueExpression#getType()
返回java.lang.Object
,因此 JSF 不会对任何已注册@FacesConverter(forClass)
执行任何自动转换。
您需要明确指定内置的javax.faces.Integer
转换器,它本质上是一个@FacesConverter(forClass=java.lang.Integer)
。
<h:selectOneListbox ... converterId="javax.faces.Integer">
如果您正在使用例如#{bean.foo}
private Integer foo
,因为这样ValueExpression#getType()
将返回java.lang.Integer
,因此 JSF 可以找到内置转换器。
另请参阅:
- 为什么 JSF 将字符串值放在 Map<..., Integer> 中?以及如何解决它?
- "空转换器"的转换错误设置值 - 为什么在 JSF 中需要转换器?