1

我们有一个实体MyType

MyType { String s; getS();}

我们有一个MyTypeConverter用于这种类型的 JSF 转换器:

@FacesConverter(forClass=MyType.class)
MyTypeConverter { 
    public String getAsString() { return ((MyType)o).getS().toUpperCase();}
}

我们有一个支持 bean MyBean

MyBean { 
    getMyType() { return new MyType("hallo");}
}

我们有一个观点my.xhtml

<h:outputText value="#{myBean.myType}"/>

上面的视图工作正常:

你好

当我按如下方式编辑它时:

<h:outputText value="(#{myBean.myType})"/>

我希望看到:

(HALLO)

然而,结果是:

(org.playground.model.MyType@cb4a479)

这是如何引起的,我该如何解决?

4

2 回答 2

1

当你有一个带有 a 的转换器时,forClass如果值是指定的类型,它就会被调用。myBean.myTypeis 显然是 typeMyType(#{myBean.myType})其评估结果#{'('.concat(myBean.myType.toString()).concat(')')是 type String,因此转换器不会也不能应用于给定值。

我认为您的意图是,只要 EL 表达式计算为 type 的值,就会使用转换器MyType。但它只会像您<f:converter converterId="myTypeConverter"/>在某些 ui 控件上指定它一样应用。value如果给定的-property 是无效类型,这也不起作用。

要解决此问题,您要么必须覆盖toString-method on ,在 EL 中显式调用转换器,要么定义在 EL中显式调用并返回您希望查看的字符串的MyType另一个方法。MyType

于 2013-08-26T08:44:05.133 回答
1

转换器适用于整个组件的值。在你的情况下,

<h:outputText value="(#{myBean.myType})"/>

这被评估为String因为括号。

把括号放在外面就行了。

(<h:outputText value="#{myBean.myType}"/>)

也可以看看:

于 2013-08-26T12:56:22.680 回答