我们有一个实体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)
这是如何引起的?如何解决?
答案 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}"/>)