Available since OmniFaces 1.0

The <o:converter> is a taghandler that extends the standard <f:converter> tag family with support for deferred value expressions in all attributes. In other words, the converter attributes are not evaluated anymore on a per view build time basis, but just on every access like as with UI components and bean properties. This has among others the advantage that they can be evaluated on a per-iteration basis inside an iterating component, and that they can be set on a custom converter without needing to explicitly register it in a tagfile.


When you specify for example the standard <f:convertDateTime> by converterId="jakarta.faces.DateTime", then you'll be able to use all its attributes such as pattern and locale as per its documentation, but then with the possibility to supply deferred value expressions.

<o:converter converterId="jakarta.faces.DateTime" pattern="#{item.pattern}" locale="#{item.locale}" />

The converter ID of all standard Faces converters can be found in their javadocs. First go to the javadoc of the class of interest, then go to CONVERTER_ID in its field summary and finally click the Constant Field Values link to see the value.

JSF 2.3 compatibility

The <o:converter> is currently not compatible with converters which are managed via the managed=true attribute set on the FacesConverter annotation, at least not when using Mojarra. Internally, the converters are wrapped in another instance which doesn't have the needed setter methods specified. In order to get them to work with <o:converter>, the managed=true attribute needs to be removed, so that OmniFaces ConverterManager will automatically manage them.


In the below demo, it was the intent to use <f:convertDateTime> as follows:

 <f:convertDateTime type="localDateTime" dateStyle="full" timeStyle="full" locale="#{locale}" />

But this wouldn't even run, it will throw the following exception because the #{locale} isn't available during view build time (for a background explanation, check this Stack Overflow answer).

jakarta.faces.view.facelets.TagAttributeException: /showcase/taghandlers/converter.xhtml @53,101 locale="" Attribute did not evaluate to a String or Locale: null
    at com.sun.jsf-impl@4.0.0.SP01//com.sun.faces.facelets.tag.faces.ComponentSupport.getLocale(ComponentSupport.java:423)
    at com.sun.jsf-impl@4.0.0.SP01//com.sun.faces.facelets.tag.faces.core.ConvertDateTimeHandler.setAttributes(ConvertDateTimeHandler.java:89)
    at com.sun.jsf-impl@4.0.0.SP01//com.sun.faces.facelets.tag.faces.ConverterTagHandlerDelegateImpl.applyAttachedObject(ConverterTagHandlerDelegateImpl.java:117)

It works as intuitively expected with the <o:converter> as it allows a render time evaluation of attributes.

For another related use case, checkout the <o:validator> showcase page.

Language Full date time pattern
English Saturday, December 3, 2022 at 5:24:03 PM Central European Standard Time
Spanish sábado, 3 de diciembre de 2022, 17:24:03 (hora estándar de Europa central)
French samedi 3 décembre 2022 à 17:24:03 heure normale d’Europe centrale
German Samstag, 3. Dezember 2022 um 17:24:03 Mitteleuropäische Normalzeit
Dutch zaterdag 3 december 2022 om 17:24:03 Midden-Europese standaardtijd
Arabic السبت، 3 ديسمبر 2022 5:24:03 م توقيت وسط أوروبا الرسمي
Hebrew יום שבת, 3 בדצמבר 2022 בשעה 17:24:03 שעון מרכז אירופה (חורף)
Chinese 2022年12月3日星期六 中欧标准时间 下午5:24:03
Demo source code
<h:dataTable value="#{converterBean.locales}" var="locale">
        <f:facet name="header">Language</f:facet>
        <f:facet name="header">Full date time pattern</f:facet>
        <h:outputText value="#{now.zonedDateTime}">
            <o:converter converterId="jakarta.faces.DateTime" type="localDateTime" dateStyle="full" timeStyle="full" locale="#{locale}" />
Documentation & Sources

VDL documentation

API documentation

Java source code