Hello.
I have following selectOneMenu setup for edit form:
<h:selectOneMenu id="parent" value="#{CategoryBean.category.parent}"
converter="CategoryConverter" >
<f:selectItem itemLabel="--" itemValue=""/>
<f:selectItems value="#{CategoryBean.parentCategorysAsSelectItems}" />
</h:selectOneMenu>
Where coresponding backing bean is:
public class CategoryBean {
private Category category;
private boolean editmode;
public List getParentCategorysAsSelectItems() throws SQLException {
List items = new ArrayList();
CategoryDAO dao = SqlMapDAOFactory.getCategoryDAO();
List cats = dao.asSortedList(category.getId());
for (Iterator it = cats.iterator(); it.hasNext();) {
Category cat = (Category) it.next();
items.add(new SelectItem(cat, cat.getName(), null, false));
}
return items;
}
...
}
And converter:
public class CategoryConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent
uIComponent, String string) throws ConverterException {
Category cat = new Category();
try {
cat.setId(new Integer(string));
} catch (NumberFormatException ex) {
return null;
}
return cat;
}
public String getAsString(FacesContext facesContext, UIComponent
uIComponent, Object object) throws ConverterException {
if(object == null) return null;
Category cat;
try {
cat = (Category) object;
} catch (ClassCastException e) {
return "";
}
return String.valueOf(cat.getId());
}
}
And everything seem work fine except one strange bug: when i open
editing page and type incorrect data into some fields, while one of
items choosen in selectOneMenu, then following Exception occurs:
2007-04-30 00:27:17 StandardWrapperValve[Faces Servlet]:
Servlet.service() for servlet Faces Servlet threw exception
javax.faces.FacesException: java.io.NotSerializableException:
goroshina.domain.Category
at
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)
at
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
at
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
at
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
...
javax.faces.FacesException: java.io.NotSerializableException:
goroshina.domain.Category
at
org.apache.myfaces.shared_impl.util.StateUtils.getAsByteArray(StateUtils.java:194)
at
org.apache.myfaces.shared_impl.util.StateUtils.construct(StateUtils.java:154)
at
org.apache.myfaces.renderkit.html.HtmlResponseStateManager.writeState(HtmlResponseStateManager.java:88)
at
org.apache.myfaces.application.jsp.JspStateManagerImpl.writeState(JspStateManagerImpl.java:398)
at
org.apache.myfaces.taglib.core.ViewTag.doAfterBody(ViewTag.java:150)
at
org.apache.jsp.admin.category_005fedit_jsp._jspx_meth_f_view_0(category_005fedit_jsp.java:194)
...
Caused by: java.io.NotSerializableException: goroshina.domain.Category
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1156)
at
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1338)
at
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1146)
at
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326)
at java.util.ArrayList.writeObject(ArrayList.java:570)
at sun.reflect.GeneratedMethodAccessor578.invoke(Unknown Source)
....
This excpetion does not occur if no item selected in selectOneMenu.
Strange, maybe i missed somewhere in docs that backing bean properties
must be serializable.
Or maybe im using wrong setup for "selectOneMenu" ?
Thanks.