Class ValidatorManager
- java.lang.Object
-
- org.omnifaces.cdi.validator.ValidatorManager
-
@ApplicationScoped public class ValidatorManager extends Object
The
@FacesValidator
is by default not eligible for dependency injection by@Inject
nor@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 validator instance into the JSF application context, and hence you won't be able to make use ofApplication.createValidator(String)
on it.Initially, this should be solved in JSF 2.2 which comes with new support for dependency injection in among others all
jakarta.faces.*.*Factory
,NavigationHandler
,ResourceHandler
,ActionListener
,PhaseListener
andSystemEventListener
instances. TheConverter
andValidator
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 allFacesValidator
instances eligible for dependency injection without any further modification.The
ValidatorManager
provides access to allFacesValidator
annotatedValidator
instances which are made eligible for CDI.bean-discovery-mode
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 coverFacesValidator
annotated classes as well, you need to explicitly setbean-discovery-mode="all"
attribute inbeans.xml
. This was not necessary in Mojarra versions older than 2.2.9 due to an oversight. If you want to keep the default ofbean-discovery-mode="annotated"
, then you need to addDependent
annotation to the validator class.AmbiguousResolutionException
In case you have a
FacesValidator
annotated class extending anotherFacesValidator
annotated class which in turn extends a standard validator, then you may withbean-discovery-mode="all"
face anAmbiguousResolutionException
. This can be solved by placingSpecializes
annotation on the subclass.JSF 2.3 compatibility
OmniFaces 3.0 continued to work fine with regard to managed validators which are initially developed for JSF 2.2. However, JSF 2.3 introduced two new features for validators: parameterized validators and managed validators. When the validator is parameterized as in
implements Validator<T>
, then you need to use at least OmniFaces 3.1 wherein the incompatibility was fixed. When the validator is managed with the new JSF 2.3managed=true
attribute set on theFacesValidator
annotation, then the validator won't be managed by OmniFaces and will continue to work fine for JSF. But the <o:validator> tag won't be able to set attributes on it.- Since:
- 1.6
- Author:
- Radu Creanga <[email protected]>, Bauke Scholtz
- See Also:
OmniApplication
,OmniApplicationFactory
-
-
Constructor Summary
Constructors Constructor Description ValidatorManager()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Validator
createValidator(Application application, String validatorId)
Returns the validator instance associated with the given validator ID, ornull
if there is none.
-
-
-
Method Detail
-
createValidator
public Validator createValidator(Application application, String validatorId)
Returns the validator instance associated with the given validator ID, ornull
if there is none.- Parameters:
application
- The involved JSF application.validatorId
- The validator ID of the desired validator instance.- Returns:
- the validator instance associated with the given validator ID,
or
null
if there is none.
-
-