code: public String getValue2Render(FacesContext fc, UIComponent c) {
  		if (c instanceof ValueHolder) {
  
  			if (c instanceof EditableValueHolder) {
  				Object sv = ((EditableValueHolder) c).getSubmittedValue();
  				if (sv != null) {
  					return sv.toString();
  				}
  			}
  
  			ValueHolder vh = (ValueHolder) c;
  			Object val = vh.getValue();
  
  			// format the value as string
  			if (val != null) {
  				/*
  				 * OLD Converter converter = getConverter(fc, vh);
  				 */
  
  				/* NEW */
  				Converter converter = vh.getConverter();
  				if (converter == null) {
  					Class<?> valueType = val.getClass();
  					if (valueType == String.class && (null == fc.getApplication().createConverter(String.class))) {
  						return (String) val;
  					}
  
  					converter = fc.getApplication().createConverter(valueType);
  				}
  				/* END NEW */
  
  				if (converter != null)
  					return converter.getAsString(fc, c, val);
  				else
  					return val.toString(); // Use toString as a fallback if
  											// there is no explicit or implicit
  											// converter
  			} else {
  				// component is a value holder but has no value
  				return null;
  			}
  		}
  
  		// component it not a value holder
  		return null;
  	}
docs: Algorithm works as follows; - If it's an input component, submitted value is
  checked first since it'd be the value to be used in case validation errors
  terminates jsf lifecycle - Finally the value of the component is retrieved
  from backing bean and if there's a converter, converted value is returned
  
  @param fc
  FacesContext instance
  @param c
  UIComponent instance whose value will be returned
  @return End text