Jsf 将值放入EL中的viewScope映射而不显式转换是否始终转换为java.lang.String?

Jsf 将值放入EL中的viewScope映射而不显式转换是否始终转换为java.lang.String?,jsf,el,Jsf,El,f:selectItem中的值是一个整数(Const.DB\u NEW\u DATASET),但是testlistener的输出总是java.lang.String。这不是我所期望的 xhtml 豆子 @Named @视域 公共类MyBean实现了可序列化{ @注入 @视图地图 私有地图视图地图; 公共void testlistener(){ System.out.println(viewMap.get('foo').getClass()); } } 公共类常量{ 公共静态最终整数DB_NE

f:selectItem
中的值是一个整数(
Const.DB\u NEW\u DATASET
),但是
testlistener
的输出总是
java.lang.String
。这不是我所期望的

xhtml


豆子

@Named
@视域
公共类MyBean实现了可序列化{
@注入
@视图地图
私有地图视图地图;
公共void testlistener(){
System.out.println(viewMap.get('foo').getClass());
}
}
公共类常量{
公共静态最终整数DB_NEW_DATASET=-1;
}
Mojarra 2.3.9.SP01实际上根本不是“转换为
java.lang.String
”。它只是JSF未转换的默认类型

这是因为of
{viewScope.foo}
返回
java.lang.Object
,因此JSF不会对任何注册的
@FacesConverter(forClass)
执行任何自动转换

您需要显式指定内置转换器,它本质上是一个
@facescoverter(forClass=java.lang.Integer)


如果将例如
{bean.foo}
私有整数foo
一起使用,这是不必要的,因为这样
ValueExpression#getType()
将返回
java.lang.Integer
,因此JSF可以找到内置转换器

另见:
它实际上根本不是“转换为
java.lang.String
”。它只是JSF未转换的默认类型

这是因为of
{viewScope.foo}
返回
java.lang.Object
,因此JSF不会对任何注册的
@FacesConverter(forClass)
执行任何自动转换

您需要显式指定内置转换器,它本质上是一个
@facescoverter(forClass=java.lang.Integer)


如果将例如
{bean.foo}
私有整数foo
一起使用,这是不必要的,因为这样
ValueExpression#getType()
将返回
java.lang.Integer
,因此JSF可以找到内置转换器

另见:
<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;
}
<h:selectOneListbox ... converterId="javax.faces.Integer">