h中的实体转换器:outputText

时间:2013-08-26 08:21:20

标签: jsf converter el

我们有一个实体MyType

MyType { String s; getS();}

我们为此类型提供了一个JSF转换器MyTypeConverter

@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}"/>

以上观点运作良好:

  

HALLO

当我按如下方式编辑时:

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

我希望看到:

(HALLO)

然而,结果是:

(org.playground.model.MyType@cb4a479)

这是如何引起的?如何解决?

2 个答案:

答案 0 :(得分:1)

当你有一个forClass的转换器时,如果该值是指定类型,则会调用它。 myBean.myType显然属于MyType类型,但(#{myBean.myType})的结果为#{'('.concat(myBean.myType.toString()).concat(')')的类型为String,因此转换器不会也不能应用于给定值。

我认为您的意图是,只要EL表达式求值为MyType类型的值,就会使用转换器。但它只会被应用,就像你在某些ui-controls上用<f:converter converterId="myTypeConverter"/>指定它一样。如果给定的value - 属性属于无效类型,则无效。

要解决此问题,您必须覆盖toString上的MyType - 方法,在EL中显式调用转换器,或者在MyType上定义另一个明确调用的方法在EL中,它返回你想看到的字符串。

答案 1 :(得分:1)

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

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

由于括号,它被评估为String

把括号放在外面。

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

另见: