code: public String getStringValueFromModel(FacesContext context)
          throws ConverterException {
          ValueExpression ve = getValueExpression("value");
          if (ve == null) {
              return null;
          }
  
          Object currentValue = ve.getValue(context.getELContext());
  
          // If there is a converter attribute, use it to to ask application
          // instance for a converter with this identifer.
          Converter c = getConverter();
  
          if (c == null) {
              // if value is null and no converter attribute is specified, then
              // return null (null has meaning for a view parameters; it means remove it).
              if (currentValue == null) {
                  return null;
              }
              // Do not look for "by-type" converters for Strings
              if (currentValue instanceof String) {
                  return (String) currentValue;
              }
  
              // if converter attribute set, try to acquire a converter
              // using its class type.
  
              Class converterType = currentValue.getClass();
              c = context.getApplication().createConverter(converterType);
  
              // if there is no default converter available for this identifier,
              // assume the model type to be String.
              if (c == null) {
                  return currentValue.toString();
              }
          }
  
          return c.getAsString(context, this, currentValue);
      }
docs: <p class="changed_added_2_0">Manually perform standard conversion
  steps to get a string value from the value expression.</p>
  
  @since 2.0