Inject support in Converter, Validator and Behavor

In JSF 2.3, Converter, Validator and Behavior are refactored to generic interfaces.

Have a look at the Converter interface.

public interface Converter<T> {

    public T getAsObject(FacesContext context, UIComponent component,
                              String value);

    public String getAsString(FacesContext context, UIComponent component,
                              T value);  
}

And these interfaces also support @Inject and also can be injected into other beans, which are originally planned in JSF 2.2, but delayed to be implemented in JSF 2.3.

Let's create a simple sample to taste it. TagsConverter is used to convert tag string to a tag list in backing bean.

@FacesConverter(value = "tagsConverter", managed = true)
public class TagsConverter implements Converter<List<String>> {

    @Inject
    ConverterUtils utils;

    @Override
    public List<String> getAsObject(FacesContext context, UIComponent component, String value) {
       return utils.stringToList(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, List<String> value) {
       return utils.listToString(value);
    }

}

managed = true indicates the converter is a CDI managed converter.

To demonstrate @Inject supports in Converter, I extracted the conversion handling process into a CDI bean ConverterUtils, and inject it in TagsConverter.

Now you can apply this converter on an input field in a facelets template.

The backingBean code is:

And the TagsConverter can be injected into other beans like other generic CDI beans.

In the facelets template, we can bind it to the converter directly.

Let's run this sample on Glassfish v5, open browser and navigate to http://localhost:8080/jsf-converter/converter.faces.

jsf converter

Grab the source codes from my GitHub account, and have a try.

Last updated

Was this helpful?