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