jsf 2 - Dynamic JSF converter -


the data access layer behind jsf app uses 2 different formats date fields (sometimes ddmmyyyy, yyyymmdd); displayed date dd/mm/yyyy.

is there way use 2 different converters single field , decide 1 use dynamically? "if command button clicked, use converter, else if other command button clicked, use converter".

balusc explains why difficult here: https://stackoverflow.com/a/7123153/3284943

based on suggestions, created this:

in jsf file, use custom converter , defined attributes, select converter , dynamic attributes @ runtime. snippet dynamic primefaces datatable:

<h:outputtext rendered = "#{column.datetime}" value="#{table[column.name]}">     <f:converter converterid="runtimeconverterselector" />     <f:attribute name="converterid" value="#{column.convertername}" />     <f:attribute name="pattern" value="#{column.converterpattern}" /> </h:outputtext> 

the custom converter:

@facesconverter ("runtimeconverterselector") public class runtimeconverterselector implements converter {     converter delegateconverter;     @override     public object getasobject(facescontext context, uicomponent component, string value) {         retrieveattributes(component);         return delegateconverter.getasobject(context, component, value);     }     @override     public string getasstring(facescontext context, uicomponent component, object value) {         retrieveattributes(component);         return delegateconverter.getasstring(context, component, value);     }     private void retrieveattributes(uicomponent component) {         object attribute;         attribute = component.getattributes().get("converterid");         if (attribute != null) {             string convertername = (string)attribute;             switch (convertername) {                 case "javax.faces.bigdecimal":                     delegateconverter = new bigdecimalconverter();                     break;                 case "javax.faces.biginteger":                     delegateconverter = new bigintegerconverter();                     break;                 case "javax.faces.boolean":                     delegateconverter = new booleanconverter();                     break;                 case "javax.faces.byte":                     delegateconverter = new byteconverter();                     break;                 case "javax.faces.character":                     delegateconverter = new characterconverter();                     break;                 case "javax.faces.datetimeconverter":                     delegateconverter = new datetimeconverter();                     attribute = component.getattributes().get("pattern");                     if (attribute != null) ((datetimeconverter)delegateconverter).setpattern((string)attribute);                     attribute = component.getattributes().get("timezone");                     if (attribute != null) ((datetimeconverter)delegateconverter).settimezone(timezone.gettimezone((string)attribute));                     attribute = component.getattributes().get("datestyle");                     if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute);                     attribute = component.getattributes().get("timestyle");                     if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute);                     attribute = component.getattributes().get("type");                     if (attribute != null) ((datetimeconverter)delegateconverter).setdatestyle((string)attribute);                     break;                 case "javax.faces.double":                     delegateconverter = new doubleconverter();                     break;                 case "javax.faces.enum":                     delegateconverter = new enumconverter();                     break;                 case "javax.faces.float":                     delegateconverter = new floatconverter();                     break;                 case "javax.faces.integer":                     delegateconverter = new integerconverter();                     break;                 case "javax.faces.long":                     delegateconverter = new longconverter();                     break;                 case "javax.faces.number":                     delegateconverter = new numberconverter();                     attribute = component.getattributes().get("currencycode");                     if (attribute != null) ((numberconverter)delegateconverter).setcurrencycode((string)attribute);                     attribute = component.getattributes().get("currencysymbol");                     if (attribute != null) ((numberconverter)delegateconverter).setcurrencysymbol((string)attribute);                     attribute = component.getattributes().get("groupingused");                     if (attribute != null) ((numberconverter)delegateconverter).setgroupingused(boolean.parseboolean((string)attribute));                     attribute = component.getattributes().get("integeronly");                     if (attribute != null) ((numberconverter)delegateconverter).setintegeronly(boolean.parseboolean((string)attribute));                     attribute = component.getattributes().get("locale");                     if (attribute != null) ((numberconverter)delegateconverter).setlocale(new locale((string)attribute));                     attribute = component.getattributes().get("maxfractiondigits");                     if (attribute != null) ((numberconverter)delegateconverter).setmaxfractiondigits(integer.parseint((string)attribute));                     attribute = component.getattributes().get("maxintegerdigits");                     if (attribute != null) ((numberconverter)delegateconverter).setmaxintegerdigits(integer.parseint((string)attribute));                     attribute = component.getattributes().get("minfractiondigits");                     if (attribute != null) ((numberconverter)delegateconverter).setminfractiondigits(integer.parseint((string)attribute));                     attribute = component.getattributes().get("minintegerdigits");                     if (attribute != null) ((numberconverter)delegateconverter).setminintegerdigits(integer.parseint((string)attribute));                     attribute = component.getattributes().get("pattern");                     if (attribute != null) ((numberconverter)delegateconverter).setpattern((string)attribute);                     attribute = component.getattributes().get("type");                     if (attribute != null) ((numberconverter)delegateconverter).settype((string)attribute);                     break;                 case "javax.faces.short":                     delegateconverter = new shortconverter();                     break;                 default:                     system.err.println("converterid provided runtimeconverterselector, '" + convertername + "' invalid. default converter used");                     break;             }         } else {             system.err.println("no converterid provided runtimeconverterselector.  default converter used.");         }     } } 

Comments