Available since OmniFaces 1.6
@FacesConverter is by default not eligible for dependency injection by
@EJB. There is a workaround for EJB, but this is nasty and doesn't work out for CDI. Another way would be to make it a JSF or CDI managed bean, however this doesn't register the converter instance into the JSF application context, and hence you won't be able to make use of
Application.createConverter(String) on it. Further it also breaks the power of
forClass attribute, i.e. you can't register a JSF converter for a specific type anymore and you'd need to explicitly declare it everytime.
Initially, this should be solved in JSF 2.2 which comes with new support for dependency injection in among others all
SystemEventListener instances. The
Validator were initially also among them, but they broke a TCK test and were at the last moment removed from dependency injection support.
The support is expected to come back in JSF 2.3, but we just can't wait any longer. MyFaces CODI has support for it, but it requires an additional
@Advanced annotation. OmniFaces solves this by implicitly making all
FacesConverter instances eligible for dependency injection without any further modification.
In Java EE 7's CDI 1.1, when having a CDI 1.1 compatible
beans.xml, by default only classes with an explicit CDI managed bean scope annotation will be registered for dependency injection support. In order to cover
FacesConverter annotated classes as well, you need to explicitly set
bean-discovery-mode="all" attribute in
beans.xml. This was not necessary in Mojarra versions older than 2.2.9 due to an oversight.
In case you have a
FacesConverter annotated class extending another
FacesConverter annotated class which in turn extends a standard converter, then you may with
bean-discovery-mode="all" face an
AmbiguousResolutionException. This can be solved by placing
Specializes annotation on the subclass.
Converters with special Class constructor
By default, CDI only instantiates beans via the default constructor. In case a converter for a class is created, and the returned converter does not have a default constructor, or has a single argument constructor that takes a
Class instance, then this converter will not be made eligible for CDI. This change was added in OmniFaces 2.6 as per issue 25.
Submit the form
Converter will print itself and both the injected EJB and CDI bean in a faces message. Note: EJB is stateless and CDI bean is request scoped.