我有下一个Java模型bean(不仅包含以毫秒为单位的日期,还包含时区)

public class Device {

    private Calendar lentDate;

    // getters and setters
}


和下一个xhtml页面片段

<rich:dataTable value="#{tagBean.devices}" var="device">
    <rich:column>
        <h:outputText value="#{device.lentDate.time}">
            <f:convertDateTime pattern="dd.MM.yyyy" timeZone="#{device.lentDate.timeZone}"/>
        </h:outputText>
    </rich:column>
</rich:dataTable>


但是timeZone属性无法获取device.lentDate.timeZone值。看起来是因为呈现f:convertDateTime标记时,设备变量尚不可用。

是否可以在设备变量可用后强制JSF渲染f:convertDateTime标签?还是在这种情况下为每个设备正确设置timeZone的唯一方法是创建自定义日期/时间转换器?

谢谢。

最佳答案

问题在于,构建视图时会评估转换器的属性。部分原因是转换器不是组件本身,而是在由TagHandler实现的Facelets中,该实现在父组件中设置转换器实例。有关详细的背景说明,请参见JSTL in JSF2 Facelets... makes sense?

您可以通过使用OmniFaces中专门为该用例构建的<o:converter>来解决此问题。与常规转换器相反,此转换器确实在呈现其父组件时评估其属性。

参见:http://showcase.omnifaces.org/taghandlers/converter

关于java - JSF 2:rich:dataTable中的f:convertDateTime,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21966417/

10-09 19:52