Writing you own converter is a pretty straight forward process. It really comes down to implementing the Converter API.
Say you want to write a converter that will convert colors. Lets assume we support, "Red", "Green" and "Blue".
package color;
public class ColorConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if ("Red".equals(value)) {
return new Color(255, 0, 0);
}
if ("Green".equals(value)) {
return new Color(0, 255, 0);
}
if ("Blue".equals(value)) {
return new Color(0, 0, 255);
}
throw new ConverterException("Unable to convert color: " + value);
}
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Color) {
Color color = (Color) value;
if (Color.RED.equals(color)) {
return "Red";
}
if (Color.GREEN.equals(color)) {
return "Green";
}
if (Color.BLUE.equals(color)) {
return "Blue";
}
}
throw new ConverterException("Unable to convert to a color");
}
}
To make sure you can use your custom Converter you will need configure it so the JSF runtime knows about it. Adding it to your faces-config.xml will do the trick.
<converter>
<converter-id>ColorConverter</converter-id>
<converter-class>color.ColorConverter</converter-class>
</converter>
And hooking this converter up to a inputText would be done as follows.
<h:inputText value="#{echo.color}">
<f:converter converterId="ColorConverter"/>
</h:inputText>
Posted October 4, 2012