converter and dropdowns
leeovan Jul 3, 2007 3:12 PMhello im trying to understand converters and also their place in dropdowns.. I have seen many posts about seams new s:convertEntity but i dont want an entity. Im thinking i want something like this..
a base class that all objects of the type i want to display will extend.
public class ReferenceData { private String name; private Integer id; public ReferenceData(Integer id, String name) { this.id = id; this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
then i have a class that extends this. with nothing else in it.
i then use this to make my list of objects to display on the screen
public static final Vector<JobType> getMyJobTypes() { Vector<JobType> types = new Vector<JobType>(); types.add(new JobType(new Integer(1), "hello1")); types.add(new JobType(new Integer(2), "hello2")); types.add(new JobType(new Integer(3), "hello3")); return types; }
with this
<h:selectOneMenu value="#{jobManagerHome.selectedJobType}" converter="#{converters.referenceDataConverter}"> <s:selectItems value="#{jobManagerHome.jobDetailTypesRefData}" var="jt" label="#{jt.name}" /> <a:support event="onchange" /> </h:selectOneMenu>
this is the converter
@Name("referenceDataConverter") @Intercept(NEVER) @Converter public class ReferenceDataConverter implements javax.faces.convert.Converter { List<ReferenceData> list; public String getAsString(FacesContext facesContext, UIComponent component, Object obj) { if (obj == null) return null; ReferenceData referenceData = (ReferenceData) obj; String val = String.valueOf(referenceData.getName()); return val; } public Object getAsObject(FacesContext facesContext, UIComponent component, String string) throws ConverterException { if (string == null || string.length() == 0) { return null; } int id = Integer.valueOf(string).intValue(); for (ReferenceData referenceData : list) { if (referenceData.getId() == id) { return referenceData; } } return null; } }
however i get this error
java.lang.IllegalArgumentException: Value is no String (class=uk.co.anotion.entity.jobs.JobType, value=uk.co.anotion.entity.jobs.JobType@5d8897) and component jobDetail:_id0with path: {Component-Path : [Class: org.ajax4jsf.framework.ajax.AjaxViewRoot,ViewId: /JobDetailEditComponent.xhtml][Class: javax.faces.component.html.HtmlForm,Id: jobDetail][Class: org.richfaces.component.html.HtmlPanel,Id: jobSelectionPanel][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _id0]} does not have a Converter at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:536) at org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:555) at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderSelectOptions(HtmlRendererUtils.java:398) at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:298) at org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:252) at org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:54) at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536) at org.ajax4jsf.framework.renderer.RendererBase.renderChild(RendererBase.java:286) at org.ajax4jsf.framework.renderer.RendererBase.renderChildren(RendererBase.java:262) at org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:189) at org.richfaces.renderkit.html.PanelRenderer.doEncodeChildren(PanelRenderer.java:184) at org.ajax4jsf.framework.renderer.RendererBase.encodeChildren(RendererBase.java:121) at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:524) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:244) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249) at com.sun.facelets.tag.jsf.ComponentSupport.encodeRecursive(ComponentSupport.java:249) at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:573) at org.ajax4jsf.framework.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108) at org.ajax4jsf.framework.ajax.AjaxViewHandler.renderView(AjaxViewHandler.java:229) at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:138) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.seam.web.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:63) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:57)
any help welcome