0

我想在 jsf 中格式化一个 xmlgregoriancalendar 类型的日期。我遇到过帖子说我需要自定义转换器。有没有人找到不需要自定义日期转换器的解决方案。我正在尝试关注,但我给了我错误说...

元素类型“h:outputText”必须后跟属性规范“>”或“/>”。

这是我在 jsf 上尝试过的

<h:outputText value="#{fn:substringBefore(aClip.lastTransmittedDate,"T")}">
     <f:convertDateTime pattern="dd.MM.yyyy" />
</h:outputText>

任何人都可以指出解释我遇到的错误吗?

4

2 回答 2

4

除了您的 EL 语法错误(基本上,使用嵌套的双引号,您将属性值结束得太快以至于它变成value="#{fn:substringBefore(aClip.lastTransmittedDate,"了完全错误的 EL 语法),这毕竟绝对不是正确的方法。

<f:convertDateTime>转换Date为,String反之亦然。正如您错误地预期的那样,它根本不会将String日期模式 X转换为日期模式 Y。String

给定 a XMLGregorianCalendar,您需要XMLGregorianCalendar#toGregorianCalendar()从中获取一个具体java.util.Calendar实例,这反过来又提供了getTime()一种从中获取具体java.util.Date实例的方法,可以直接在<f:convertDateTime>.

如果您的环境支持 EL 2.2,则应该这样做:

<h:outputText value="#{aClip.lastTransmittedDate.toGregorianCalendar().time}">
    <f:convertDateTime pattern="dd.MM.yyyy" />
</h:outputText>

或者,如果您的环境不支持 EL 2.2,则更改模型,例如让 getter 返回java.util.Calendar

public Calendar getLastTransmittedDateAsCalendar() {
    return lastTransmittedDate.toGregorianCalendar();
}

这样你就可以使用

<h:outputText value="#{aClip.lastTransmittedDateAsCalendar.time}">
    <f:convertDateTime pattern="dd.MM.yyyy" />
</h:outputText>

您甚至可以添加一个返回具体的吸气剂java.util.Date

于 2013-06-25T16:19:15.527 回答
1

实际上,这个错误表明您没有格式正确的 XML。在 EL 中,您应该使用单引号来表示String. 在你的情况下value="#{fn:substringBefore(aClip.lastTransmittedDate,'T')}"

日期转换器呢,您应该在#{aClip.lastTransmittedDate}属性类型上看到。如果是日期,只需使用

<h:outputText value="#{aClip.lastTransmittedDate}">
    <f:convertDateTime pattern="dd.MM.yyyy" />
</h:outputText>

如果它不是日期(即字符串),<f:convertDateTime/>将不起作用,您应该在 Java 代码中重新格式化它。例如,创建另一个 getter,它将返回表示属性值的修改后的字符串。

于 2013-06-25T14:12:27.110 回答