Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

Note that in addition to this FAQ, there are a number of "how-to" guides on the MyFaces wiki home page that address common issues.

Table of Contents
maxLevel4
minLevel2maxLevel4

What is MyFaces?

MyFaces is a family of projects related to the JavaServer Faces (JSF) specification published as part of the Java Community Process. The "core" project is an implementation of that specification. Other MyFaces projects implement related specifications (eg the Portlet Bridge), or add features to any JSF implementation (not just the Myfaces Core).

...

If you want to serialize the list within the !DataModel along with the managed bean, then do this:

Code Block
borderStylesolid
titleSomeManagedBean.javaborderStylesolid
public class SomeManagedBean implements Serializable {
  private List myData;

  private transient DataModel myDataModel;

  public DataModel getDataModel() {
    if (myDataModel == null) {
      myDataModel = new ListDataModel(myData);
    }
    return myDataModel;
  }
}

...

If you want the old behavior, I suggest creating a custom selectItem component that converts the value using the converter from the input control. Here is the code:

Code Block
borderStylesolid
titleUISelectItem.javaborderStylesolid
public class UISelectItem
  extends javax.faces.component.UISelectItem
{
  public final static String COMPONENT_TYPE = "org.apache.myfaces.wiki.SelectItem";
  private Boolean convertValue;

  /**
   * @return the convertValue
   */
  public boolean getConvertValue()
  {
    if (this.convertValue != null) return this.convertValue;
    ValueBinding vb = getValueBinding("convertValue");
    return (vb == null) ? true : (Boolean) vb.getValue(getFacesContext());
  }

  /**
   * @param convertValue the convertValue to set
   */
  public void setConvertValue(boolean convertValue)
  {
    this.convertValue = convertValue;
  }

  /**
   * @see javax.faces.component.UISelectItem#getItemValue()
   */
  @Override
  public Object getItemValue()
  {
    Object value = super.getItemValue();
    
    if (getConvertValue())
    {
      UIInput parent = null;
      for (UIComponent comp = getParent(); comp != null; comp = comp.getParent())
      {
        if (comp instanceof UIInput)
        {
          parent = (UIInput)comp;
          break;
        }
      }
      if (parent != null)
        value = getConvertedValue(getFacesContext(), parent, value);
    }
    return value;
  }

  /**
   * @see javax.faces.component.UISelectItem#saveState(javax.faces.context.FacesContext)
   */
  @Override
  public Object saveState(FacesContext context)
  {
    return new Object[] {
      super.saveState(context), convertValue, };
  }

  /**
   * @see javax.faces.component.UISelectItem#restoreState(javax.faces.context.FacesContext, java.lang.Object)
   */
  @Override
  public void restoreState(FacesContext context, Object state)
  {
    Object[] arr = (Object[]) state;
    int index = -1;
    super.restoreState(context, arr[++index]);
    this.convertValue = (Boolean) arr[++index];
  }

  private Object getConvertedValue(FacesContext context, UIInput input, Object value)
    throws ConverterException
  {
    Renderer renderer = getRenderer(context);
    if (renderer != null)
      return renderer.getConvertedValue(context, this, value);
    else if (value instanceof String)
    {
      Converter converter = RendererUtils.findUIOutputConverter(
        context, input);
      if (converter != null)
        return converter.getAsObject(context, this, (String)value);
    }
    return value;
  }
}

...