在 EL 中放入 viewScope map 的值是否没有显式转换总是转换为 java.lang.String?



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 中需要转换器?

相关内容

  • 没有找到相关文章

最新更新