【问题标题】:Converter for entity in h:outputTexth:outputText 中的实体转换器
【发布时间】:2013-08-26 08:21:20
【问题描述】:

我们有一个实体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}"/>

上面的视图工作正常:

你好

当我如下编辑它时:

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

我希望看到:

(HALLO)

但是,结果是:

(org.playground.model.MyType@cb4a479)

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

【问题讨论】:

    标签: jsf converter el


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      由于括号,这被评估为String

      把括号放在外面。

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

      另见:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-29
        • 1970-01-01
        • 2015-07-15
        • 2013-06-04
        • 1970-01-01
        • 2012-12-06
        • 2011-05-15
        • 2013-12-30
        相关资源
        最近更新 更多